Skip to content

Commit f78b1b3

Browse files
committedJun 12, 2015
fix(viewSwitcher): Broadcast view transition events in a consistent order Closes #3804
1 parent ebfb1ba commit f78b1b3

File tree

2 files changed

+75
-19
lines changed

2 files changed

+75
-19
lines changed
 

‎js/angular/service/viewSwitcher.js

+21-18
Original file line numberDiff line numberDiff line change
@@ -297,29 +297,32 @@ function($timeout, $document, $q, $ionicClickBlock, $ionicConfig, $ionicNavBarDe
297297
},
298298

299299
emit: function(step, enteringData, leavingData) {
300-
var scope = enteringEle.scope();
301-
if (scope) {
302-
scope.$emit('$ionicView.' + step + 'Enter', enteringData);
303-
if (step == 'after') {
304-
scope.$emit('$ionicView.enter', enteringData);
305-
}
306-
}
300+
var enteringScope = enteringEle.scope(),
301+
leavingScope = leavingEle && leavingEle.scope();
307302

308-
if (leavingEle) {
309-
scope = leavingEle.scope();
310-
if (scope) {
311-
scope.$emit('$ionicView.' + step + 'Leave', leavingData);
312-
if (step == 'after') {
313-
scope.$emit('$ionicView.leave', leavingData);
314-
}
303+
if (step == 'after') {
304+
if (enteringScope) {
305+
enteringScope.$emit('$ionicView.enter', enteringData);
315306
}
316307

317-
} else if (scope && leavingData && leavingData.viewId) {
318-
scope.$emit('$ionicNavView.' + step + 'Leave', leavingData);
319-
if (step == 'after') {
320-
scope.$emit('$ionicNavView.leave', leavingData);
308+
if (leavingScope) {
309+
leavingScope.$emit('$ionicView.leave', leavingData);
310+
311+
} else if (enteringScope && leavingData && leavingData.viewId) {
312+
enteringScope.$emit('$ionicNavView.leave', leavingData);
321313
}
322314
}
315+
316+
if (enteringScope) {
317+
enteringScope.$emit('$ionicView.' + step + 'Enter', enteringData);
318+
}
319+
320+
if (leavingScope) {
321+
leavingScope.$emit('$ionicView.' + step + 'Leave', leavingData);
322+
323+
} else if (enteringScope && leavingData && leavingData.viewId) {
324+
enteringScope.$emit('$ionicNavView.' + step + 'Leave', leavingData);
325+
}
323326
},
324327

325328
cleanup: function(transData) {

‎test/unit/angular/directive/navView.unit.js

+54-1
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,7 @@ describe('Ionic nav-view', function() {
900900
expect(afterLeave.stateName).toEqual('page1');
901901
expect(leave.stateName).toEqual('page1');
902902
expect(leave.transitionId).toEqual(2);
903-
903+
904904
$state.go(page1State);
905905
$q.flush();
906906
$timeout.flush();
@@ -1009,6 +1009,59 @@ describe('Ionic nav-view', function() {
10091009

10101010
expect(unloadedEvent.stateName).toEqual('tabAbstract.tab3page1');
10111011
}));
1012+
1013+
it('should emit $ionicView events in correct order', inject(function ($state, $q, $timeout, $compile, $ionicConfig) {
1014+
$ionicConfig.views.maxCache(0);
1015+
1016+
var order = [];
1017+
scope.$on('$ionicView.loaded', function(ev, d){
1018+
order.push('$ionicView.loaded');
1019+
});
1020+
scope.$on('$ionicView.beforeEnter', function(ev, d){
1021+
order.push('$ionicView.beforeEnter');
1022+
});
1023+
scope.$on('$ionicView.enter', function(ev, d){
1024+
order.push('$ionicView.enter');
1025+
});
1026+
scope.$on('$ionicView.afterEnter', function(ev, d){
1027+
order.push('$ionicView.afterEnter');
1028+
});
1029+
scope.$on('$ionicView.beforeLeave', function(ev, d){
1030+
order.push('$ionicView.beforeLeave');
1031+
});
1032+
scope.$on('$ionicView.leave', function(ev, d){
1033+
order.push('$ionicView.leave');
1034+
});
1035+
scope.$on('$ionicView.afterLeave', function(ev, d){
1036+
order.push('$ionicView.afterLeave');
1037+
});
1038+
scope.$on('$ionicView.unloaded', function(ev, d){
1039+
order.push('$ionicView.unloaded');
1040+
});
1041+
1042+
elem.append($compile('<div><ion-nav-view></ion-nav-view></div>')(scope));
1043+
1044+
$state.go(page1State);
1045+
$q.flush();
1046+
$timeout.flush();
1047+
1048+
$state.go(page2State);
1049+
$q.flush();
1050+
$timeout.flush();
1051+
1052+
expect(order[0]).toEqual('$ionicView.loaded');
1053+
expect(order[1]).toEqual('$ionicView.beforeEnter');
1054+
expect(order[2]).toEqual('$ionicView.enter');
1055+
expect(order[3]).toEqual('$ionicView.afterEnter');
1056+
expect(order[4]).toEqual('$ionicView.loaded');
1057+
expect(order[5]).toEqual('$ionicView.beforeEnter');
1058+
expect(order[6]).toEqual('$ionicView.beforeLeave');
1059+
expect(order[7]).toEqual('$ionicView.enter');
1060+
expect(order[8]).toEqual('$ionicView.leave');
1061+
expect(order[9]).toEqual('$ionicView.afterEnter');
1062+
expect(order[10]).toEqual('$ionicView.afterLeave');
1063+
expect(order[11]).toEqual('$ionicView.unloaded');
1064+
}));
10121065

10131066
it('should clear ion-nav-view cache', inject(function ($state, $q, $timeout, $compile, $ionicHistory) {
10141067
elem.append($compile('<div><ion-nav-view></ion-nav-view></div>')(scope));

0 commit comments

Comments
 (0)