mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-19 03:32:21 +08:00
feat(nav): detach ChangeDetectorRef during transition
This commit is contained in:
@ -1,4 +1,4 @@
|
|||||||
import {Compiler, ElementRef, Injector, provide, NgZone, DynamicComponentLoader, AppViewManager, Renderer} from 'angular2/angular2';
|
import {ChangeDetectorRef, Compiler, ElementRef, Injector, provide, NgZone, DynamicComponentLoader, AppViewManager, Renderer} from 'angular2/angular2';
|
||||||
|
|
||||||
import {Ion} from '../ion';
|
import {Ion} from '../ion';
|
||||||
import {IonicApp} from '../app/app';
|
import {IonicApp} from '../app/app';
|
||||||
@ -107,7 +107,8 @@ export class NavController extends Ion {
|
|||||||
loader: DynamicComponentLoader,
|
loader: DynamicComponentLoader,
|
||||||
viewManager: AppViewManager,
|
viewManager: AppViewManager,
|
||||||
zone: NgZone,
|
zone: NgZone,
|
||||||
renderer: Renderer
|
renderer: Renderer,
|
||||||
|
cd: ChangeDetectorRef
|
||||||
) {
|
) {
|
||||||
super(elementRef, config);
|
super(elementRef, config);
|
||||||
|
|
||||||
@ -121,6 +122,7 @@ export class NavController extends Ion {
|
|||||||
this._viewManager = viewManager;
|
this._viewManager = viewManager;
|
||||||
this._zone = zone;
|
this._zone = zone;
|
||||||
this._renderer = renderer;
|
this._renderer = renderer;
|
||||||
|
this._cd = cd;
|
||||||
|
|
||||||
this._views = [];
|
this._views = [];
|
||||||
this._trnsTime = 0;
|
this._trnsTime = 0;
|
||||||
@ -579,7 +581,6 @@ export class NavController extends Ion {
|
|||||||
* @returns {any} TODO
|
* @returns {any} TODO
|
||||||
*/
|
*/
|
||||||
_transition(enteringView, leavingView, opts, done) {
|
_transition(enteringView, leavingView, opts, done) {
|
||||||
console.debug('_transition', enteringView, leavingView, opts);
|
|
||||||
let self = this;
|
let self = this;
|
||||||
|
|
||||||
if (enteringView === leavingView) {
|
if (enteringView === leavingView) {
|
||||||
@ -594,7 +595,7 @@ export class NavController extends Ion {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!enteringView) {
|
if (!enteringView) {
|
||||||
// if not entering view then create a bogus one
|
// if no entering view then create a bogus one
|
||||||
enteringView = new ViewController()
|
enteringView = new ViewController()
|
||||||
enteringView.loaded();
|
enteringView.loaded();
|
||||||
}
|
}
|
||||||
@ -640,6 +641,13 @@ export class NavController extends Ion {
|
|||||||
self.app.setEnabled(enableApp, duration);
|
self.app.setEnabled(enableApp, duration);
|
||||||
self.setTransitioning(!enableApp, duration);
|
self.setTransitioning(!enableApp, duration);
|
||||||
|
|
||||||
|
if (!enableApp) {
|
||||||
|
// do a quick check for changes
|
||||||
|
// then detach the change detection during a transition
|
||||||
|
self._cd.detectChanges();
|
||||||
|
self._cd.detach();
|
||||||
|
}
|
||||||
|
|
||||||
if (opts.pageType) {
|
if (opts.pageType) {
|
||||||
transAnimation.before.addClass(opts.pageType);
|
transAnimation.before.addClass(opts.pageType);
|
||||||
}
|
}
|
||||||
@ -658,10 +666,20 @@ export class NavController extends Ion {
|
|||||||
leavingView.didLeave();
|
leavingView.didLeave();
|
||||||
}
|
}
|
||||||
|
|
||||||
// all done!
|
// reattach the change detection
|
||||||
|
self._cd.reattach();
|
||||||
|
|
||||||
self._zone.run(() => {
|
self._zone.run(() => {
|
||||||
self._transComplete();
|
if (self.keyboard.isOpen()) {
|
||||||
done(enteringView);
|
self.keyboard.onClose(() => {
|
||||||
|
self._transComplete();
|
||||||
|
done(enteringView);
|
||||||
|
}, 32);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
self._transComplete();
|
||||||
|
done(enteringView);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -669,15 +687,7 @@ export class NavController extends Ion {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait for the new view to complete setup
|
self._stage(enteringView, beginTransition);
|
||||||
if (self.keyboard.isOpen()) {
|
|
||||||
self._stage(enteringView, () => {
|
|
||||||
self.keyboard.onClose(beginTransition, 64);
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
|
||||||
self._stage(enteringView, beginTransition);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import {Component, Directive, ElementRef, Host, Optional, forwardRef, Inject, NgZone, Compiler, AppViewManager, DynamicComponentLoader, Renderer, ViewContainerRef} from 'angular2/angular2';
|
import {ChangeDetectorRef, Component, Directive, ElementRef, Host, Optional, forwardRef, Inject, NgZone, Compiler, AppViewManager, DynamicComponentLoader, Renderer, ViewContainerRef} from 'angular2/angular2';
|
||||||
|
|
||||||
import {IonicApp} from '../app/app';
|
import {IonicApp} from '../app/app';
|
||||||
import {Config} from '../../config/config';
|
import {Config} from '../../config/config';
|
||||||
@ -120,9 +120,11 @@ export class Nav extends NavController {
|
|||||||
loader: DynamicComponentLoader,
|
loader: DynamicComponentLoader,
|
||||||
viewManager: AppViewManager,
|
viewManager: AppViewManager,
|
||||||
zone: NgZone,
|
zone: NgZone,
|
||||||
renderer: Renderer
|
renderer: Renderer,
|
||||||
|
cd: ChangeDetectorRef
|
||||||
) {
|
) {
|
||||||
super(hostNavCtrl, app, config, keyboard, elementRef, compiler, loader, viewManager, zone, renderer);
|
super(hostNavCtrl, app, config, keyboard, elementRef, compiler,
|
||||||
|
loader, viewManager, zone, renderer, cd);
|
||||||
|
|
||||||
if (viewCtrl) {
|
if (viewCtrl) {
|
||||||
// an ion-nav can also act as an ion-page within a parent ion-nav
|
// an ion-nav can also act as an ion-page within a parent ion-nav
|
||||||
|
@ -233,10 +233,18 @@ class AnotherPage {
|
|||||||
|
|
||||||
@App({
|
@App({
|
||||||
pages: [FirstPage, FullPage, PrimaryHeaderPage, AnotherPage],
|
pages: [FirstPage, FullPage, PrimaryHeaderPage, AnotherPage],
|
||||||
template: `<ion-nav [root]="root"></ion-nav>`
|
template: `<ion-nav [root]="root"></ion-nav>`,
|
||||||
|
host: {
|
||||||
|
'[class.is-change-detecting]': 'isChangeDetecting'
|
||||||
|
}
|
||||||
})
|
})
|
||||||
class E2EApp {
|
class E2EApp {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.root = FirstPage;
|
this.root = FirstPage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get isChangeDetecting() {
|
||||||
|
console.log('isChangeDetecting');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import {Component, Directive, Host, ElementRef, Compiler, DynamicComponentLoader, AppViewManager, NgZone, Renderer} from 'angular2/angular2';
|
import {ChangeDetectorRef, Component, Directive, Host, ElementRef, Compiler, DynamicComponentLoader, AppViewManager, NgZone, Renderer} from 'angular2/angular2';
|
||||||
|
|
||||||
import {IonicApp} from '../app/app';
|
import {IonicApp} from '../app/app';
|
||||||
import {Config} from '../../config/config';
|
import {Config} from '../../config/config';
|
||||||
@ -79,10 +79,13 @@ export class Tab extends NavController {
|
|||||||
loader: DynamicComponentLoader,
|
loader: DynamicComponentLoader,
|
||||||
viewManager: AppViewManager,
|
viewManager: AppViewManager,
|
||||||
zone: NgZone,
|
zone: NgZone,
|
||||||
renderer: Renderer
|
renderer: Renderer,
|
||||||
|
cd: ChangeDetectorRef
|
||||||
) {
|
) {
|
||||||
// A Tab is a NavController for its child pages
|
// A Tab is a NavController for its child pages
|
||||||
super(parentTabs, app, config, keyboard, elementRef, compiler, loader, viewManager, zone, renderer);
|
super(parentTabs, app, config, keyboard, elementRef, compiler,
|
||||||
|
loader, viewManager, zone, renderer, cd);
|
||||||
|
|
||||||
this._isInitial = parentTabs.add(this);
|
this._isInitial = parentTabs.add(this);
|
||||||
|
|
||||||
this._panelId = 'tabpanel-' + this.id;
|
this._panelId = 'tabpanel-' + this.id;
|
||||||
|
@ -2,7 +2,7 @@ import {Injectable, NgZone} from 'angular2/angular2';
|
|||||||
|
|
||||||
import {Config} from '../config/config';
|
import {Config} from '../config/config';
|
||||||
import {Form} from './form';
|
import {Form} from './form';
|
||||||
import {hasFocusedTextInput, raf} from './dom';
|
import {hasFocusedTextInput, raf, rafFrames} from './dom';
|
||||||
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@ -35,9 +35,11 @@ export class Keyboard {
|
|||||||
|
|
||||||
function checkKeyboard() {
|
function checkKeyboard() {
|
||||||
if (!self.isOpen()) {
|
if (!self.isOpen()) {
|
||||||
self.zone.run(() => {
|
rafFrames(30, () => {
|
||||||
console.debug('keyboard closed');
|
self.zone.run(() => {
|
||||||
callback();
|
console.debug('keyboard closed');
|
||||||
|
callback();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -47,7 +49,7 @@ export class Keyboard {
|
|||||||
|
|
||||||
setTimeout(checkKeyboard, pollingInternval);
|
setTimeout(checkKeyboard, pollingInternval);
|
||||||
});
|
});
|
||||||
|
|
||||||
return promise;
|
return promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user