$ rootScope事件preventDefault不会停止成功处理程序

时间:2015-10-12 13:19:30

标签: angularjs angular-ui-router angularjs-rootscope

我正在使用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您可以清除控制台并重新运行以查看日志。

1 个答案:

答案 0 :(得分:1)

您接近答案 - 因为没有内置的“默认”事件可以阻止,preventDefault只设置defaultPrevented布尔值;你必须在func2中检查那个布尔值,如果它是真的就拯救掉。 (可能有任意数量的函数正在观察stateChangeStart; angular没有任何直接的方式知道func2是你想要的“默认”函数。)

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