fix(navClear): only set viewOptions if click leads to state change

Closes #1043
This commit is contained in:
Andy Joslin
2014-04-07 10:20:11 -06:00
parent d6c960c2a6
commit 4dffc5f6c6
2 changed files with 26 additions and 23 deletions

View File

@@ -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);
}
}
};

View File

@@ -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);
}));
});