2015-07-01 101 views
2

我有一個角度的UI路由器事件 '$ stateChangeStart':如何強制事件等待解決Angular.js中的承諾?

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

和我onUrlChange_功能,如:

function onUrlChange_(event) { 
    ModalDialog.show('confirm', { //this is promise 
    bodyContent: { 
     i18n: 'forms.unsavedConfirmMessage' 
    } 
    }).then(function() {}, function() { 
    event.preventDefault(); 
    }) 
} 

所以,我想阻止只有當承諾被拒絕的事件。但是這個代碼不起作用,因爲事件繼續執行,不等待承諾。

回答

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