3

我正在使用 ui-router 并为登录页面重定向注册了两个 $stateChangeStart 处理程序。

function func1(e,to,toParams, from, fromParams){
    ....
    if (notAuthenticated) {
        e.preventDefault();
        $state.go('login');
    }
}

function func2(e,to,toParams, from, fromParams){
    ...
    console.log('func2', from, to, e.defaultPrevented);
}

$rootScope.on('$stateChangeStart', func1);
$rootScope.on('$stateChangeStart', func2);

作为 func1 preventDefault(),我可以看到在 func2 e.defaultPrevented 为真。我只是不明白为什么阻止 func1 中的默认值不会阻止 func2 执行。这种行为是设计使然吗?如果是,“默认”是什么意思?

这是 plunk:http ://plnkr.co/edit/o81NVo?p=preview您可以清除控制台并重新运行以查看日志。

4

1 回答 1

2

你已经接近答案了——因为没有内置的“默认”事件可以阻止,preventDefault所以只设置defaultPrevented布尔值;你必须检查 func2 中的布尔值,如果它是真的就退出。(可能有任意数量的函数在监视stateChangeStart;angular 没有任何直接的方法可以知道 func2 是您打算成为“默认”的函数。)

(如果原始事件是$emited,您可以使用stopPropagation它来防止它在 DOM 中进一步冒泡;这是可能的,因为$emits 按定义的顺序进行,每个节点只有一个父节点。$broadcast事件不能被取消,只能被标记,因为广播可以“同时”(或者更有可能以未定义的顺序)到达兄弟节点。

于 2015-10-12T13:52:41.260 回答