如何强制事件等待解决Angular.js中的承诺?

时间:2015-07-01 13:22:39

标签: javascript events angular-ui-router angular-promise

我有一个angular-ui-router事件'$ stateChangeStart':

READ_EXTERNAL_STORAGE

和我的onUrlChange_函数,如:

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
  self.onUrlChange_(event);
});

所以,我希望只有在承诺被拒绝时才会发生预防事件。但是这个代码不起作用,因为事件继续执行而不等待承诺。

1 个答案:

答案 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);
        })
    }
});