今天來說明 ui-router 提供的事件
在各種事件中插入監聽點,可以在轉換 state 中完成一些需求。
例如說使用者在登入完後,不能在回到登入頁的需求(包括按了上一頁)。
或者在切換 state 的過程中,出現 loading icon。
在些都可以透過是事件點插入監聽 event 解決。
$stateChangeError
我的做法是直接在 app.run +$rootScope 去監聽此事件
(app.run 是可以設定該 module 配置的地方)
app.run(function ($rootScope){
$rootScope.$on('$stateChangeError',
function(evt, toState, toParams, fromState, fromParams, error) {
// 確保 state error 有丟在 console 上面
console.log('$stateChangeError', error);
});
});
$stateChangeStart
$stateChangeSuccess
$stateNotFound
畫面的事件 (view)
$viewContentLoading
$viewContentLoaded
state
onEnter
官網事件列表
在 初談 ui-router 文章中, 我說明 resolve function 會在 state render 畫面跟進入 controller 前呼叫完畢。
為了驗證發生順序,我做了一個簡單的範例並且讓 $rootScope 監聽目前 ui-router 提供的事件。
監聽範例:http://plnkr.co/edit/kB2zcqVtaYUycFJjeA7D?p=preview
結論是,
**進入 state **所會呼叫的順序是:
$stateChangeStart -> state resolve function -> (url change) -> $viewContentLoading -> state onEnter function -> $stateChangeSuccess -> controller -> $viewContentLoaded
離開 state:
$stateChangeStart -> new state 的 $viewContentLoading -> state onExist function -> $stateChangeSuccess -> new state 的 $viewContentLoaded
錯誤發生時:
$stateChangeStart -> state resolve function -> $stateChangeError -> (stay on current state)
p.s. ui-router 版本是 0.2.11