angular-ui-路由器 1.0.x: event.preventDefault & event.defaultPrevented 备选方案

angular-ui-router 1.0.x: event.preventDefault & event.defaultPrevented alternative

我刚刚将 $stateChangeStart 替换为 $transitions.onStart

$rootScope.$on('$stateChangeStart', function(e, ...){
     e.preventDefault();
     // other code goes here...
});

$transitions.onStart({}, function(tras){
     // need a code equivalent to e.preventDefault
     // need a code to identify event.defaultPrevented 
     // other code goes here...

     // get parent states
     _o.util.getAncestorStates(toState.name, true).reverse()
        .forEach(function (state) {
           // certain condition to call event.preventDefault()

           if(event.defaultPrevented) {....}
     });
});

我想,我们可以通过添加 return $q.reject() 而不是 e.preventDefault() 来阻止转换,但我无法理解 return $q.reject() 下面的代码将如何执行。

此外,如何替换 event.defaultPrevented

我觉得应该在transition.promise上做点什么但不清楚。

对不起,我无法轻易理解官方文档 - https://ui-router.github.io/ng1/docs/latest/。谁能帮我找到更好的解释或上面代码的替代品?

您可以根据自己的逻辑选择以下两个选项之一:

  • 因为angular-ui-router 1.0.3你可以使用$transition.abort()。如果您必须在异步调用后中止状态更改,则选择更简洁。

    $transitions.onStart({}, function($transition) {
        $transition.abort();
        //more code...
    });
    
  • 此外,正如@tanmay 在评论中所说,您可以使用简单的 return false 来取消它。这也适用于非稳定版本(1.0.0.beta 和 1.0.0.rc)。 (Check it in ui-rooter docs)

    $transitions.onStart({}, function($transition) {
        //code ...
        return false;
    });