diff --git a/src/components/nav/test/advanced-nav-then-tabs/pages/tabs-one/tab-one-page-three/tab-one-page-three.ts b/src/components/nav/test/advanced-nav-then-tabs/pages/tabs-one/tab-one-page-three/tab-one-page-three.ts
index ddc3d0dc36..5deb7fc068 100644
--- a/src/components/nav/test/advanced-nav-then-tabs/pages/tabs-one/tab-one-page-three/tab-one-page-three.ts
+++ b/src/components/nav/test/advanced-nav-then-tabs/pages/tabs-one/tab-one-page-three/tab-one-page-three.ts
@@ -19,7 +19,6 @@ import { IonicPage, NavController, NavParams } from '../../../../../../..';
Name: {{paramTwo}}
-
`
})
diff --git a/src/components/nav/test/advanced-nested-navs/app/app.component.ts b/src/components/nav/test/advanced-nested-navs/app/app.component.ts
new file mode 100644
index 0000000000..9ae964b0e6
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/app/app.component.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+
+@Component({
+ template: `
+
+
+
+
+
+ `
+})
+export class AppComponent {
+ rootOne = 'NestedNavOnePageOne';
+ rootTwo = 'NestedNavTwoPageOne';
+}
diff --git a/src/components/nav/test/advanced-nested-navs/app/app.module.ts b/src/components/nav/test/advanced-nested-navs/app/app.module.ts
new file mode 100644
index 0000000000..55310fa215
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/app/app.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+import { IonicApp, IonicModule } from '../../../../..';
+
+import { AppComponent } from './app.component';
+
+@NgModule({
+ declarations: [
+ AppComponent
+ ],
+ imports: [
+ BrowserModule,
+ IonicModule.forRoot(AppComponent, { swipeBackEnabled: true, preloadModules: true }),
+ ],
+ bootstrap: [IonicApp]
+})
+export class AppModule {}
diff --git a/src/components/nav/test/advanced-nested-navs/app/main.ts b/src/components/nav/test/advanced-nested-navs/app/main.ts
new file mode 100644
index 0000000000..6af7a5b2ae
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/app/main.ts
@@ -0,0 +1,5 @@
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+
+import { AppModule } from './app.module';
+
+platformBrowserDynamic().bootstrapModule(AppModule);
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/first-page/first-page.html b/src/components/nav/test/advanced-nested-navs/pages/left/first-page/first-page.html
new file mode 100644
index 0000000000..e82b2f2388
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/first-page/first-page.html
@@ -0,0 +1,9 @@
+
+
+ Page One
+
+
+
+ Page One
+
+
\ No newline at end of file
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/first-page/first-page.module.ts b/src/components/nav/test/advanced-nested-navs/pages/left/first-page/first-page.module.ts
new file mode 100644
index 0000000000..c17e0dde59
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/first-page/first-page.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { FirstPage } from './first-page';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(FirstPage)
+ ],
+ declarations: [
+ FirstPage
+ ]
+})
+export class FirstPageModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/first-page/first-page.ts b/src/components/nav/test/advanced-nested-navs/pages/left/first-page/first-page.ts
new file mode 100644
index 0000000000..027607bc6d
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/first-page/first-page.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, } from '../../../../../../..';
+
+@IonicPage()
+@Component({
+ templateUrl: 'first-page.html'
+})
+export class FirstPage {
+ constructor(public nav: NavController) {
+ }
+
+ goToPageTwo() {
+ this.nav.push('SecondPage', { userId: '123', name: 'Michael Scott'});
+ }
+}
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-one.module.ts b/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-one.module.ts
new file mode 100644
index 0000000000..2da62fb42a
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-one.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { NestedNavOnePageOne } from './nested-nav-one-page-one';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(NestedNavOnePageOne)
+ ],
+ declarations: [
+ NestedNavOnePageOne
+ ]
+})
+export class NestedNavOnePageOneModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-one.ts b/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-one.ts
new file mode 100644
index 0000000000..e2626f8237
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-one.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, } from '../../../../../../..';
+
+@IonicPage()
+@Component({
+ template: `
+
+ `
+})
+export class NestedNavOnePageOne {
+
+ root: string = 'NestedNavOnePageTwo';
+ constructor(public nav: NavController) {
+ }
+}
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-two.module.ts b/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-two.module.ts
new file mode 100644
index 0000000000..94f61701ed
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-two.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { NestedNavOnePageTwo } from './nested-nav-one-page-two';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(NestedNavOnePageTwo)
+ ],
+ declarations: [
+ NestedNavOnePageTwo
+ ]
+})
+export class NestedNavOnePageTwoModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-two.ts b/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-two.ts
new file mode 100644
index 0000000000..e6ef5ef5c3
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/nested-nav-one/nested-nav-one-page-two.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, } from '../../../../../../..';
+
+@IonicPage()
+@Component({
+ template: `
+
+ `
+})
+export class NestedNavOnePageTwo {
+
+ root: string = 'FirstPage';
+ constructor(public nav: NavController) {
+ }
+}
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/second-page/second-page.html b/src/components/nav/test/advanced-nested-navs/pages/left/second-page/second-page.html
new file mode 100644
index 0000000000..39d1124a07
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/second-page/second-page.html
@@ -0,0 +1,15 @@
+
+
+ Page Two
+
+
+
+ Page Two
+
+ User ID: {{userId}}
+
+
+ Name {{name}}
+
+
+
\ No newline at end of file
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/second-page/second-page.module.ts b/src/components/nav/test/advanced-nested-navs/pages/left/second-page/second-page.module.ts
new file mode 100644
index 0000000000..ce824037f8
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/second-page/second-page.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { SecondPage } from './second-page';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(SecondPage)
+ ],
+ declarations: [
+ SecondPage
+ ]
+})
+export class SecondPageModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/second-page/second-page.ts b/src/components/nav/test/advanced-nested-navs/pages/left/second-page/second-page.ts
new file mode 100644
index 0000000000..44abf580fe
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/second-page/second-page.ts
@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams } from '../../../../../../..';
+
+@IonicPage({
+ segment: 'pageTwo/user/:userId/name/:name'
+})
+@Component({
+ templateUrl: 'second-page.html'
+})
+export class SecondPage {
+
+ userId: string;
+ name: string;
+ constructor(public nav: NavController, public params: NavParams) {
+ this.userId = this.params.data.userId;
+ this.name = this.params.data.name;
+ }
+
+ goToNextPage() {
+ this.nav.push('ThirdPage', { paramOne: 'mono', paramTwo: 'stereo'});
+ }
+}
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/third-page/third-page.html b/src/components/nav/test/advanced-nested-navs/pages/left/third-page/third-page.html
new file mode 100644
index 0000000000..af317e8de8
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/third-page/third-page.html
@@ -0,0 +1,14 @@
+
+
+ Page Three
+
+
+
+ Page Three
+
+ Param One: {{paramOne}}
+
+
+ Param Two: {{paramTwo}}
+
+
\ No newline at end of file
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/third-page/third-page.module.ts b/src/components/nav/test/advanced-nested-navs/pages/left/third-page/third-page.module.ts
new file mode 100644
index 0000000000..fab76aa598
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/third-page/third-page.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { ThirdPage } from './third-page';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(ThirdPage)
+ ],
+ declarations: [
+ ThirdPage
+ ]
+})
+export class ThirdPageModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/left/third-page/third-page.ts b/src/components/nav/test/advanced-nested-navs/pages/left/third-page/third-page.ts
new file mode 100644
index 0000000000..9cbbc0413f
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/left/third-page/third-page.ts
@@ -0,0 +1,17 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams} from '../../../../../../..';
+
+@IonicPage({
+ segment: 'thirdPage/paramOne/:paramOne/paramTwo/:paramTwo'
+})
+@Component({
+ templateUrl: 'third-page.html'
+})
+export class ThirdPage {
+ paramOne: string;
+ paramTwo: string;
+ constructor(public nav: NavController, public params: NavParams) {
+ this.paramOne = params.data.paramOne;
+ this.paramTwo = params.data.paramTwo;
+ }
+}
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/fifth-page/fifth-page.html b/src/components/nav/test/advanced-nested-navs/pages/right/fifth-page/fifth-page.html
new file mode 100644
index 0000000000..3a700e617f
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/fifth-page/fifth-page.html
@@ -0,0 +1,15 @@
+
+
+ Page Five
+
+
+
+ Page Five
+
+ User ID: {{userId}}
+
+
+ Name {{name}}
+
+
+
\ No newline at end of file
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/fifth-page/fifth-page.module.ts b/src/components/nav/test/advanced-nested-navs/pages/right/fifth-page/fifth-page.module.ts
new file mode 100644
index 0000000000..1499d707cf
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/fifth-page/fifth-page.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { FifthPage } from './fifth-page';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(FifthPage)
+ ],
+ declarations: [
+ FifthPage
+ ]
+})
+export class FifthPageModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/fifth-page/fifth-page.ts b/src/components/nav/test/advanced-nested-navs/pages/right/fifth-page/fifth-page.ts
new file mode 100644
index 0000000000..fd3023b1f5
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/fifth-page/fifth-page.ts
@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams } from '../../../../../../..';
+
+@IonicPage({
+ segment: 'pageFive/user/:userId/name/:name'
+})
+@Component({
+ templateUrl: 'fifth-page.html'
+})
+export class FifthPage {
+
+ userId: string;
+ name: string;
+ constructor(public nav: NavController, public params: NavParams) {
+ this.userId = this.params.data.userId;
+ this.name = this.params.data.name;
+ }
+
+ goToNextPage() {
+ this.nav.push('SixthPage', { paramOne: 'Tobey', paramTwo: 'Holly'});
+ }
+}
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/fouth-page/fourth-page.html b/src/components/nav/test/advanced-nested-navs/pages/right/fouth-page/fourth-page.html
new file mode 100644
index 0000000000..a89fef0a4e
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/fouth-page/fourth-page.html
@@ -0,0 +1,9 @@
+
+
+ Page Four
+
+
+
+ Page Four
+
+
\ No newline at end of file
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/fouth-page/fourth-page.module.ts b/src/components/nav/test/advanced-nested-navs/pages/right/fouth-page/fourth-page.module.ts
new file mode 100644
index 0000000000..d041e3bcc8
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/fouth-page/fourth-page.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { FourthPage } from './fourth-page';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(FourthPage)
+ ],
+ declarations: [
+ FourthPage
+ ]
+})
+export class FourthPageModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/fouth-page/fourth-page.ts b/src/components/nav/test/advanced-nested-navs/pages/right/fouth-page/fourth-page.ts
new file mode 100644
index 0000000000..6ad06442e0
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/fouth-page/fourth-page.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, } from '../../../../../../..';
+
+@IonicPage()
+@Component({
+ templateUrl: 'fourth-page.html'
+})
+export class FourthPage {
+ constructor(public nav: NavController) {
+ }
+
+ goToPageTwo() {
+ this.nav.push('FifthPage', { userId: '567', name: 'Pamela Beasley'});
+ }
+}
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-one.module.ts b/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-one.module.ts
new file mode 100644
index 0000000000..1fe930c8f6
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-one.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { NestedNavTwoPageOne } from './nested-nav-two-page-one';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(NestedNavTwoPageOne)
+ ],
+ declarations: [
+ NestedNavTwoPageOne
+ ]
+})
+export class NestedNavTwoPageOneModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-one.ts b/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-one.ts
new file mode 100644
index 0000000000..881a5b9b80
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-one.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, } from '../../../../../../..';
+
+@IonicPage()
+@Component({
+ template: `
+
+ `
+})
+export class NestedNavTwoPageOne {
+
+ root: string = 'NestedNavTwoPageTwo';
+ constructor(public nav: NavController) {
+ }
+}
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-two.module.ts b/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-two.module.ts
new file mode 100644
index 0000000000..0ce9ba085b
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-two.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { NestedNavTwoPageTwo } from './nested-nav-two-page-two';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(NestedNavTwoPageTwo)
+ ],
+ declarations: [
+ NestedNavTwoPageTwo
+ ]
+})
+export class NestedNavTwoPageTwoModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-two.ts b/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-two.ts
new file mode 100644
index 0000000000..6f267decef
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/nested-nav-two/nested-nav-two-page-two.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, } from '../../../../../../..';
+
+@IonicPage()
+@Component({
+ template: `
+
+ `
+})
+export class NestedNavTwoPageTwo {
+
+ root: string = 'FourthPage';
+ constructor(public nav: NavController) {
+ }
+}
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/sixth-page/sixth-page.html b/src/components/nav/test/advanced-nested-navs/pages/right/sixth-page/sixth-page.html
new file mode 100644
index 0000000000..8732947e36
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/sixth-page/sixth-page.html
@@ -0,0 +1,14 @@
+
+
+ Page Six
+
+
+
+ Page Six
+
+ Param One: {{paramOne}}
+
+
+ Param Two: {{paramTwo}}
+
+
\ No newline at end of file
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/sixth-page/sixth-page.module.ts b/src/components/nav/test/advanced-nested-navs/pages/right/sixth-page/sixth-page.module.ts
new file mode 100644
index 0000000000..212bd5c889
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/sixth-page/sixth-page.module.ts
@@ -0,0 +1,13 @@
+import { NgModule } from '@angular/core';
+import { IonicPageModule } from '../../../../../../..';
+import { SixthPage } from './sixth-page';
+
+@NgModule({
+ imports: [
+ IonicPageModule.forChild(SixthPage)
+ ],
+ declarations: [
+ SixthPage
+ ]
+})
+export class SixthPageModule { }
diff --git a/src/components/nav/test/advanced-nested-navs/pages/right/sixth-page/sixth-page.ts b/src/components/nav/test/advanced-nested-navs/pages/right/sixth-page/sixth-page.ts
new file mode 100644
index 0000000000..6f075c5fa4
--- /dev/null
+++ b/src/components/nav/test/advanced-nested-navs/pages/right/sixth-page/sixth-page.ts
@@ -0,0 +1,18 @@
+import { Component } from '@angular/core';
+import { IonicPage, NavController, NavParams} from '../../../../../../..';
+
+@IonicPage({
+ segment: 'sixthPage/paramOne/:paramOne/paramTwo/:paramTwo'
+})
+@Component({
+ templateUrl: 'sixth-page.html'
+})
+export class SixthPage {
+
+ paramOne: string;
+ paramTwo: string;
+ constructor(public nav: NavController, public params: NavParams) {
+ this.paramOne = params.data.paramOne;
+ this.paramTwo = params.data.paramTwo;
+ }
+}
diff --git a/src/components/nav/test/simple-nav-then-tabs/pages/tabs/tabs-page.ts b/src/components/nav/test/simple-nav-then-tabs/pages/tabs/tabs-page.ts
index 306cc66994..70cca4a5f9 100644
--- a/src/components/nav/test/simple-nav-then-tabs/pages/tabs/tabs-page.ts
+++ b/src/components/nav/test/simple-nav-then-tabs/pages/tabs/tabs-page.ts
@@ -4,7 +4,7 @@ import { IonicPage, } from '../../../../../..';
@IonicPage()
@Component({
template: `
-
+
diff --git a/src/components/tabs/tab.ts b/src/components/tabs/tab.ts
index ee8985c6a3..45c3b53ab8 100644
--- a/src/components/tabs/tab.ts
+++ b/src/components/tabs/tab.ts
@@ -307,14 +307,33 @@ export class Tab extends NavControllerBase implements ITab {
load(opts: NavOptions, done?: () => void) {
if (this._lazyRootFromUrl || (!this._loaded && this.root)) {
this.setElementClass('show-tab', true);
- if (this._lazyRootFromUrl) {
- this.push(this._lazyRootFromUrl, this._lazyRootFromUrlData, opts, done);
- this._lazyRootFromUrl = null;
- this._lazyRootFromUrlData = null;
- } else {
- this.push(this.root, this.rootParams, opts, done);
+ // okay, first thing we need to do if check if the view already exists
+ const nameToUse = this._lazyRootFromUrl ? this._lazyRootFromUrl : this.root;
+ const dataToUse = this._lazyRootFromUrlData ? this._lazyRootFromUrlData : this.rootParams;
+ const numViews = this.length() - 1;
+ for (let i = numViews; i >= 0; i--) {
+ const viewController = this.getByIndex(i);
+ if (viewController && (viewController.id === nameToUse || viewController.component === nameToUse)) {
+ if (i === numViews) {
+ // this is the last view in the stack and it's the same
+ // as the segment so there's no change needed
+ return done();
+ } else {
+ // it's not the exact view as the end
+ // let's have this nav go back to this exact view
+ return this.popTo(viewController, {
+ animate: false,
+ updateUrl: false,
+ }, done);
+ }
+ }
}
+ this.push(nameToUse, dataToUse, opts, done);
+
+
+ this._lazyRootFromUrl = null;
+ this._lazyRootFromUrlData = null;
this._loaded = true;
} else {
@@ -324,7 +343,7 @@ export class Tab extends NavControllerBase implements ITab {
this._dom.read(() => {
this.resize();
});
- done();
+ return done();
}
}
diff --git a/src/components/tabs/test/tab.spec.ts b/src/components/tabs/test/tab.spec.ts
new file mode 100644
index 0000000000..0c95bd2043
--- /dev/null
+++ b/src/components/tabs/test/tab.spec.ts
@@ -0,0 +1,91 @@
+import { mockTab, mockTabs, mockView, mockViews } from '../../../util/mock-providers';
+
+describe('tab', () => {
+ describe('load', () => {
+ it('should measure and refresh the tabs', () => {
+ // TODO - this test is super leaky but I cant come up with a better way short term
+ const tabs = mockTabs();
+ const tab = mockTab(tabs, false);
+ const spy = jasmine.createSpy('done');
+
+ spyOn(tab, 'push');
+ spyOn(tab, 'popTo');
+ tab.load({}, spy);
+
+ expect(tab.push).not.toHaveBeenCalled();
+ expect(tab.popTo).not.toHaveBeenCalled();
+ expect(spy).toHaveBeenCalled();
+ });
+
+ it('should reuse the view if its the top view in the stack', () => {
+ const tabs = mockTabs();
+ const tab = mockTab(tabs, false);
+ const spy = jasmine.createSpy('done');
+
+ const mockViewOne = mockView('one');
+ const mockViewTwo = mockView('two');
+ mockViews(tab, [mockViewOne, mockViewTwo]);
+
+ tab._lazyRootFromUrl = 'someValue';
+ tab._lazyRootFromUrlData = { };
+
+ mockViewTwo.id = tab._lazyRootFromUrl;
+
+ spyOn(tab, 'push');
+ spyOn(tab, 'popTo');
+
+ tab.load({}, spy);
+
+ expect(tab.push).not.toHaveBeenCalled();
+ expect(tab.popTo).not.toHaveBeenCalled();
+ expect(spy).toHaveBeenCalled();
+ });
+
+ it('should pop back to a previous view if ', () => {
+ const tabs = mockTabs();
+ const tab = mockTab(tabs, false);
+ const spy = jasmine.createSpy('done');
+
+ const mockViewOne = mockView('one');
+ const mockViewTwo = mockView('two');
+ mockViews(tab, [mockViewOne, mockViewTwo]);
+
+ tab._lazyRootFromUrl = 'someValue';
+ tab._lazyRootFromUrlData = { };
+
+ mockViewOne.id = tab._lazyRootFromUrl;
+
+ spyOn(tab, 'push');
+ spyOn(tab, 'popTo');
+
+ tab.load({}, spy);
+
+ expect(tab.push).not.toHaveBeenCalled();
+ expect(tab.popTo).toHaveBeenCalled();
+ expect(spy).not.toHaveBeenCalled();
+ });
+
+ it('should push the view if it doesnt exist already', () => {
+ const tabs = mockTabs();
+ const tab = mockTab(tabs, false);
+ const spy = jasmine.createSpy('done');
+
+ const mockViewOne = mockView('one');
+ const mockViewTwo = mockView('two');
+ mockViews(tab, [mockViewOne, mockViewTwo]);
+
+ tab._lazyRootFromUrl = 'someValue';
+ tab._lazyRootFromUrlData = { };
+
+ spyOn(tab, 'push');
+ spyOn(tab, 'popTo');
+
+ tab.load({}, spy);
+
+ expect(tab.push).toHaveBeenCalled();
+ expect(tab.popTo).not.toHaveBeenCalled();
+ expect(spy).not.toHaveBeenCalled();
+ });
+
+ });
+});
diff --git a/src/util/mock-providers.ts b/src/util/mock-providers.ts
index 78bd12ee16..e51cefe05f 100644
--- a/src/util/mock-providers.ts
+++ b/src/util/mock-providers.ts
@@ -470,7 +470,7 @@ export function mockOverlayPortal(app: App, config: Config, plt: MockPlatform):
);
}
-export function mockTab(parentTabs: Tabs): Tab {
+export function mockTab(parentTabs: Tabs, overrideLoad: boolean = true): Tab {
let platform = mockPlatform();
let config = mockConfig(null, '/', platform);
let app = (parentTabs)._app || mockApp(config, platform);
@@ -500,9 +500,11 @@ export function mockTab(parentTabs: Tabs): Tab {
null
);
- tab.load = (opts: any, cb: Function) => {
- cb();
- };
+ if (overrideLoad) {
+ tab.load = (opts: any, cb: Function) => {
+ cb();
+ };
+ }
return tab;
}