Skip to content

Commit be72d39

Browse files
committed
perf(nav): avoid running zone when it is not needed
1 parent bc5cd7f commit be72d39

File tree

3 files changed

+35
-17
lines changed

3 files changed

+35
-17
lines changed

src/navigation/nav-controller-base.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ export class NavControllerBase extends Ion implements NavController {
117117
}, done);
118118
}
119119

120-
popAll() {
120+
popAll(): Promise<any[]> {
121121
let promises: any[] = [];
122122
for (var i = this._views.length - 1; i >= 0; i--) {
123123
promises.push(this.pop(null));
@@ -133,6 +133,10 @@ export class NavControllerBase extends Ion implements NavController {
133133
}, done);
134134
}
135135

136+
removeView(viewController: ViewController, opts?: NavOptions, done?: Function): Promise<any> {
137+
return this.remove(this.indexOf(viewController), 1, opts, done);
138+
}
139+
136140
setRoot(pageOrViewCtrl: any, params?: any, opts?: NavOptions, done?: Function): Promise<any> {
137141
let viewControllers = [convertToView(this._linker, pageOrViewCtrl, params)];
138142
return this._setPages(viewControllers, opts, done);
@@ -330,15 +334,16 @@ export class NavControllerBase extends Ion implements NavController {
330334
const opts = ti.opts || {};
331335
const insertViews = ti.insertViews;
332336
const removeStart = ti.removeStart;
333-
let view;
334-
let destroyQueue: ViewController[] = [];
337+
let view: ViewController;
338+
let i: number;
339+
let destroyQueue: ViewController[];
335340

336341
// there are views to remove
337342
if (isPresent(removeStart)) {
338343
assert(removeStart >= 0, 'removeStart can not be negative');
339344
assert(ti.removeCount >= 0, 'removeCount can not be negative');
340-
341-
for (var i = 0; i < ti.removeCount; i++) {
345+
destroyQueue = [];
346+
for (i = 0; i < ti.removeCount; i++) {
342347
view = this._views[i + removeStart];
343348
if (view && view !== enteringView && view !== leavingView) {
344349
destroyQueue.push(view);
@@ -356,7 +361,7 @@ export class NavControllerBase extends Ion implements NavController {
356361
}
357362

358363
// add the views to the
359-
for (var i = 0; i < insertViews.length; i++) {
364+
for (i = 0; i < insertViews.length; i++) {
360365
view = insertViews[i];
361366
this._insertViewAt(view, ti.insertStart + i);
362367
}
@@ -366,22 +371,26 @@ export class NavControllerBase extends Ion implements NavController {
366371
opts.direction = opts.direction || DIRECTION_FORWARD;
367372
}
368373
}
374+
369375
// if the views to be removed are in the beginning or middle
370376
// and there is not a view that needs to visually transition out
371377
// then just destroy them and don't transition anything
372378
// batch all of lifecycles together
373379
// let's make sure, callbacks are zoned
374-
this._zone.run(() => {
375-
for (view of destroyQueue) {
376-
this._willLeave(view);
377-
this._didLeave(view);
378-
this._willUnload(view);
379-
}
380-
});
380+
if (destroyQueue && destroyQueue.length > 0) {
381+
this._zone.run(() => {
382+
for (i = 0; i < destroyQueue.length; i++) {
383+
view = destroyQueue[i];
384+
this._willLeave(view);
385+
this._didLeave(view);
386+
this._willUnload(view);
387+
}
388+
});
381389

382-
// once all lifecycle events has been delivered, we can safely detroy the views
383-
for (view of destroyQueue) {
384-
this._destroyView(view);
390+
// once all lifecycle events has been delivered, we can safely detroy the views
391+
for (i = 0; i < destroyQueue.length; i++) {
392+
this._destroyView(destroyQueue[i]);
393+
}
385394
}
386395

387396
if (ti.enteringRequiresTransition || ti.leavingRequiresTransition && enteringView !== leavingView) {

src/navigation/nav-controller.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,15 @@ export abstract class NavController {
452452
*/
453453
abstract remove(startIndex: number, removeCount?: number, opts?: NavOptions, done?: Function): Promise<any>;
454454

455+
/**
456+
* Removes the specified view controller from the nav stack.
457+
*
458+
* @param {ViewController} [viewController] The viewcontroller to remove.
459+
* @param {object} [opts={}] Any options you want to use pass to transtion.
460+
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
461+
*/
462+
abstract removeView(viewController: ViewController, opts?: NavOptions, done?: Function): Promise<any>;
463+
455464
/**
456465
* Set the root for the current navigation stack.
457466
* @param {Page|ViewController} page The name of the component you want to push on the navigation stack.

src/navigation/view-controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export class ViewController {
179179

180180
let options = assign({}, this._leavingOpts, navOptions);
181181
this._onWillDismiss && this._onWillDismiss(data, role);
182-
return this._nav.remove(this._nav.indexOf(this), 1, options).then(() => {
182+
return this._nav.removeView(this, options).then(() => {
183183
this._onDidDismiss && this._onDidDismiss(data, role);
184184
this._onDidDismiss = null;
185185
return data;

0 commit comments

Comments
 (0)