diff --git a/src/animations/animation.ts b/src/animations/animation.ts index afa0e6127e..acc2104219 100644 --- a/src/animations/animation.ts +++ b/src/animations/animation.ts @@ -92,7 +92,14 @@ export class Animation { * not have a duration, then it'll get the duration from its parent. */ getDuration(opts?: PlayOptions): number { - return (opts && isDefined(opts.duration) ? opts.duration : this._dur !== null ? this._dur : (this.parent && this.parent.getDuration()) || 0); + if (opts && isDefined(opts.duration)) { + return opts.duration; + } else if (this._dur !== null) { + return this._dur; + } else if (this.parent) { + return this.parent.getDuration(); + } + return 0; } /** diff --git a/src/components/datetime/datetime.ts b/src/components/datetime/datetime.ts index 87f8c4d33d..2bbdd27d70 100644 --- a/src/components/datetime/datetime.ts +++ b/src/components/datetime/datetime.ts @@ -488,7 +488,7 @@ export class DateTime extends Ion implements AfterContentInit, ControlValueAcces { text: this.doneText, handler: (data: any) => { - console.log('datetime, done', data); + console.debug('datetime, done', data); this.onChange(data); this.ionChange.emit(data); } diff --git a/src/navigation/nav-controller-base.ts b/src/navigation/nav-controller-base.ts index 2b374029ed..3ff8af93a1 100644 --- a/src/navigation/nav-controller-base.ts +++ b/src/navigation/nav-controller-base.ts @@ -215,7 +215,7 @@ export class NavControllerBase extends Ion implements NavController { if (ti.insertViews) { // ensure we've got good views to insert ti.insertViews = ti.insertViews.filter(v => v !== null); - if (!ti.insertViews.length) { + if (ti.insertViews.length === 0) { ti.reject('invalid views to insert'); return; } @@ -336,9 +336,11 @@ export class NavControllerBase extends Ion implements NavController { // there are views to remove if (isPresent(removeStart)) { + assert(removeStart >= 0, 'removeStart can not be negative'); + assert(ti.removeCount >= 0, 'removeCount can not be negative'); + for (var i = 0; i < ti.removeCount; i++) { view = this._views[i + removeStart]; - assert(view, 'internal error, view in destroyQueue can not be null'); if (view && view !== enteringView && view !== leavingView) { destroyQueue.push(view); } @@ -421,6 +423,8 @@ export class NavControllerBase extends Ion implements NavController { } _viewAttachToDOM(view: ViewController, componentRef: ComponentRef, viewport: ViewContainerRef) { + assert(view._state === ViewState.INITIALIZED, 'view state must be INITIALIZED'); + // successfully finished loading the entering view // fire off the "didLoad" lifecycle events this._didLoad(view); @@ -517,21 +521,23 @@ export class NavControllerBase extends Ion implements NavController { this._sbTrns = transition; } - transition.registerStart(() => { - this._trnsStart(transition, enteringView, leavingView, opts, resolve); - if (transition.parent) { - transition.parent.start(); - } - }); - if (enteringView && enteringView._state === ViewState.INITIALIZED) { // render the entering component in the DOM // this would also render new child navs/views // which may have their very own async canEnter/Leave tests // ******** DOM WRITE **************** this._viewAttachToDOM(enteringView, enteringView._cmp, this._viewport); + } else { + console.debug('enteringView state is not INITIALIZED', enteringView); } + transition.registerStart(() => { + this._trnsStart(transition, enteringView, leavingView, opts, resolve); + if (transition.parent) { + transition.parent.start(); + } + }); + if (!transition.hasChildren) { // lowest level transition, so kick it off and let it bubble up to start all of them transition.start(); @@ -572,9 +578,7 @@ export class NavControllerBase extends Ion implements NavController { // create a callback that needs to run within zone // that will fire off the willEnter/Leave lifecycle events at the right time - transition.beforeAddRead(() => { - this._zone.run(this._viewsWillLifecycles.bind(this, enteringView, leavingView)); - }); + transition.beforeAddRead(this._viewsWillLifecycles.bind(this, enteringView, leavingView)); // create a callback for when the animation is done transition.onFinish(() => { @@ -616,9 +620,13 @@ export class NavControllerBase extends Ion implements NavController { } _viewsWillLifecycles(enteringView: ViewController, leavingView: ViewController) { - // call each view's lifecycle events - enteringView && this._willEnter(enteringView); - leavingView && this._willLeave(leavingView); + if (enteringView || leavingView) { + this._zone.run(() => { + // call each view's lifecycle events + enteringView && this._willEnter(enteringView); + leavingView && this._willLeave(leavingView); + }); + } } _trnsFinish(transition: Transition, opts: NavOptions, resolve: TransitionResolveFn) { @@ -689,6 +697,7 @@ export class NavControllerBase extends Ion implements NavController { _removeView(view: ViewController) { const views = this._views; const index = views.indexOf(view); + assert(index > -1, 'view must be part of the stack'); if (index > -1) { views.splice(index, 1); } @@ -812,6 +821,7 @@ export class NavControllerBase extends Ion implements NavController { view._willUnload(); view._destroy(this._renderer); } + // purge stack this._views.length = 0; this._sbGesture && this._sbGesture.destroy(); @@ -917,11 +927,11 @@ export class NavControllerBase extends Ion implements NavController { this._trnsTm = (isTransitioning ? (Date.now() + durationPadding + ACTIVE_TRANSITION_OFFSET) : 0); } - getActive() { + getActive(): ViewController { return this._views[this._views.length - 1]; } - isActive(view: ViewController) { + isActive(view: ViewController): boolean { return (view === this.getActive()); } @@ -968,8 +978,7 @@ export class NavControllerBase extends Ion implements NavController { } dismissPageChangeViews() { - for (var i = 0; i < this._views.length; i++) { - var view = this._views[i]; + for (let view of this._views) { if (view.data && view.data.dismissOnPageChange) { view.dismiss(); }