我有一个angular-ui-router事件'$ stateChangeStart':
READ_EXTERNAL_STORAGE
和我的onUrlChange_函数,如:
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
self.onUrlChange_(event);
});
所以,我希望只有在承诺被拒绝时才会发生预防事件。但是这个代码不起作用,因为事件继续执行而不等待承诺。
答案 0 :(得分:2)
以下是您的代码的细微变化。这种方法基本上首先取消事件,然后提示。如果提示成功,则再次手动触发状态更改事件。
单独的布尔变量会跟踪您是否已经提示用户并阻止您陷入循环。如果您有任何问题,请告诉我。
//Have an outer variable to check if user has already been shown the modal prompt
var isWarned=false;
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
if (isWarned === false) {
//Cancel the original event
event.preventDefault();
ModalDialog.show('confirm', {
bodyContent: {
i18n: 'forms.unsavedConfirmMessage'
}
}).then(function() {}, function() {
//Mark the isWarned flag so user is not warned again.Resume the navigation
isWarned = true;
$state.go(toState.name, toParams);
})
}
});