2015-10-12 41 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事件不能被取消,只會被標記,因爲廣播可能會到達兄弟節點「同時」(或更可能以未定義的順序)。