2016-10-09 31 views
1

在AngularJS 1.5.8應用程序中,我使用UI路由器在全部使用相同控制器的頁面之間導航。 ng-controller屬性應用於body標籤,並且ui-view屬性應用於顯然位於HTML主體內的div。爲了簡便起見,我們假設它看起來像這樣:當UI路由器狀態發生變化時清除共享的AngularJS控制器變量

<body ng-controller="SecurityController as securityCtrl"> 
    <div ui-view></div> 
</body> 

一個例子路線,萬一,有助於形象化我說的話,就是:

.state('login', { 
    url: "/login/:returnState", 
    templateUrl: "Account/Login" 
}) 

路由工作正常,而當我改變狀態它不重新初始化控制器,這是我想要的。我在控制器中有一個errorMessage變量,我希望在狀態更改時將其設置爲undefined,但我寧願不將JavaScript添加到導航按鈕以實現此目的。

我知道您可以註冊路由事件處理程序,並且我已成功將它們用於$stateChangeError$viewContentLoaded,但可用的參數是event, toState, toParams, fromState, fromParams, and error。我沒有看到我可以如何輕鬆地使用它們,沒有大的switch聲明,告訴公共控制器將其變量errorMessage設置爲undefined。並不是所有的路線都需要清除這個變量,但我想我可以清除它是否需要這樣做。

另外,我聽說你可以在每次狀態改變後重新初始化控制器。這是計劃B或C.

什麼是最簡單的方式來標記路線的一個子集,我可以很容易地確定是否以這種方式標記fromState或toState,以便我可以清除變量?如果你能想到一個更好的(仍然是乾的)的方式來做到這一點,我全都耳熟能詳。

回答

2
.state('someState', { 
    url: "/somestate", 
    data: { resetMessage: true } 
    ... 
}) 

而在你.run

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { 
    if (toState.data.resetMessage) 
    { 
    ... //Clear errorMessageVariable 
    } 
}); 
+0

它的工作原理就像一個魅力。 –

+0

如果有人有同樣的問題,我應該說,雖然這個答案是一個很好的方法來標記路線,但它可能不允許問題的標題要求。我不確定是否可以使用這種技術清除控制器變量。如果您將$ injector添加到angular.module(...)。run參數中,那麼您可以獲得請求類型的** a **控制器,但它與您已經使用的不同。對我而言,這是行不通的。其他帖子中的建議是將要清除的變量放入服務中,而不是控制器。這對我有效。 –

相關問題