2016-10-09 3 views
1

AngularJS 1.5.8のアプリケーションでは、ui-routerを使用して、すべて同じコントローラを使用するページ間を移動しています。 ng-controller属性はbodyタグに適用され、ui-view属性はdivのボディに明示的に含まれるdivに適用されます。単純化のために、のは、それは次のようになりましょう:ui-routerの状態が変更されたときの共有AngularJSコントローラの変数

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

例ルート、私が言っているものを視覚化するのに役立ちます場合には、次のとおりです。

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

ルーティングが正常に動作し、いつれます私はそれが私が望むコントローラを再初期化していない状態を変更します。状態が変わるたびに未定義に設定するコントローラの変数はerrorMessageですが、ナビゲーションボタンにjavascriptを追加しないでください。

ルーティングのためにイベントハンドラを登録することができますが、$stateChangeError$viewContentLoadedに正常に使用していますが、使用できるパラメータはevent, toState, toParams, fromState, fromParams, and errorです。大規模なswitchステートメントを使わずにこれらを簡単に使用して、共通コントローラにerrorMessage変数を未定義に設定するように指示する方法はわかりません。すべてのルートがこの変数をクリアする必要はありませんが、そうしているかどうかを確認するだけで済みます。

さらに、各状態の変更後にコントローラを再初期化できると聞きました。それは計画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

誰かが同じ問題を抱えている場合は、この回答は経路をマークする良い方法ですが、質問のタイトルが要求する内容を許可しない可能性があります。この手法を使用してコントローラ変数をクリアすることが可能かどうかはわかりません。 angular.module(...)。argumentsに$ injectorを追加すると、要求するタイプの** a **コントローラを取得できますが、すでに使用しているインスタンスと同じではありません。私のために、それは動作しません。他の投稿の提案は、コントローラではなく、サービスでクリアしたい変数を置くことです。それは私のために働いた。 –

関連する問題