mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2026-03-13 10:22:08 +08:00
fix(navClear): only set viewOptions if click leads to state change
Closes #1043
This commit is contained in:
28
js/ext/angular/src/directive/ionicViewState.js
vendored
28
js/ext/angular/src/directive/ionicViewState.js
vendored
@@ -300,19 +300,33 @@ angular.module('ionic.ui.viewState', ['ionic.service.view', 'ionic.service.gestu
|
||||
*/
|
||||
.directive('navClear', [
|
||||
'$ionicViewService',
|
||||
function($ionicViewService) {
|
||||
'$state',
|
||||
'$location',
|
||||
'$window',
|
||||
'$rootScope',
|
||||
function($ionicViewService, $location, $state, $window, $rootScope) {
|
||||
$rootScope.$on('$stateChangeError', function() {
|
||||
$ionicViewService.nextViewOptions(null);
|
||||
});
|
||||
return {
|
||||
priority: 100,
|
||||
restrict: 'AC',
|
||||
compile: function($element) {
|
||||
return { pre: prelink };
|
||||
function prelink($scope, $element) {
|
||||
$element.on('click', function(e){
|
||||
$ionicViewService.nextViewOptions({
|
||||
disableAnimate: true,
|
||||
disableBack: true
|
||||
function prelink($scope, $element, $attrs) {
|
||||
var unregisterListener;
|
||||
function listenForStateChange() {
|
||||
unregisterListener = $scope.$on('$stateChangeStart', function() {
|
||||
$ionicViewService.nextViewOptions({
|
||||
disableAnimate: true,
|
||||
disableBack: true
|
||||
});
|
||||
unregisterListener();
|
||||
});
|
||||
});
|
||||
$window.setTimeout(unregisterListener, 300);
|
||||
}
|
||||
|
||||
$element.on('click', listenForStateChange);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,28 +1,17 @@
|
||||
describe('navClear directive', function() {
|
||||
ddescribe('navClear directive', function() {
|
||||
beforeEach(module('ionic'));
|
||||
it('should call nextViewOptions on click', inject(function($rootScope, $compile, $ionicViewService) {
|
||||
|
||||
it('should call nextViewOptions on click & stateChangeSuccess', inject(function($rootScope, $compile, $ionicViewService) {
|
||||
spyOn($ionicViewService, 'nextViewOptions');
|
||||
var el = $compile('<div nav-clear>')($rootScope.$new());
|
||||
|
||||
expect($ionicViewService.nextViewOptions).not.toHaveBeenCalled();
|
||||
el.triggerHandler('click');
|
||||
el.scope().$broadcast('$stateChangeStart');
|
||||
expect($ionicViewService.nextViewOptions).toHaveBeenCalled();
|
||||
expect($ionicViewService.nextViewOptions.mostRecentCall.args[0]).toEqual({
|
||||
disableAnimate: true,
|
||||
disableBack: true
|
||||
});
|
||||
}));
|
||||
|
||||
it('should run its click action before ngClick', inject(function($rootScope, $compile, $ionicViewService) {
|
||||
spyOn($ionicViewService, 'nextViewOptions');
|
||||
var el = $compile('<div nav-clear ng-click="method()">')($rootScope.$new());
|
||||
var done = false;
|
||||
|
||||
//navClear should've called nextViewOptions by the time the ngClick handler runs
|
||||
el.scope().method = function() {
|
||||
expect($ionicViewService.nextViewOptions).toHaveBeenCalled();
|
||||
done = true;
|
||||
};
|
||||
el.triggerHandler('click');
|
||||
expect(done).toBe(true);
|
||||
}));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user