我正在使用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执行。这种行为是设计的吗?如果是,“默认”是什么意思?
这是插件:http://plnkr.co/edit/o81NVo?p=preview您可以清除控制台并重新运行以查看日志。
答案 0 :(得分:1)
您接近答案 - 因为没有内置的“默认”事件可以阻止,preventDefault
只设置defaultPrevented
布尔值;你必须在func2中检查那个布尔值,如果它是真的就拯救掉。 (可能有任意数量的函数正在观察stateChangeStart
; angular没有任何直接的方式知道func2是你想要的“默认”函数。)
(如果原始事件是$emit
,您可以使用stopPropagation
来阻止它在DOM中进一步冒泡;这是可能的,因为$emit
按照定义的顺序进行,每个节点只有一个父节点。$broadcast
事件不能被取消,只能被标记,因为广播可以“同时”到达兄弟节点(或者更可能是未定义的顺序)。