2015-10-12 23 views
2

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

回答

1

您已接近答案 - 因为没有内置的“默认”事件可以防止,所以preventDefault只设置defaultPrevented布尔值;你必须检查func2中的布尔值,并保证它是否为真。 (可能有任何数量的功能正在关注stateChangeStart;角度没有任何直接的方式知道func2是你打算成为“默认”的那个)

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