3 つのビュー (実際には 3 つのディレクティブ) を表示する AngularJS シングルページ アプリがあります。私の質問を説明するために、私の UI が GMail の UI と同じで、私の 3 つのビューが次のとおりであると仮定しましょう。
- ナビゲーション ペイン(左) -- GMail では、「受信トレイ」、「下書き」などのフォルダが表示されます。
- ツールバー(右上) -- GMail がボタンを表示する場所
- コンテンツ ペイン(右下) -- GMail がメッセージを表示する場所
これら 3 つのビューは、パスが変更されるたびに更新する必要があります。例えば:
- ナビゲーション ウィンドウでは、特定の項目を強調表示する必要があります。
- ツールバーは、特定のボタンを表示/非表示にする必要があります。
- コンテンツ ペインは、サーバーから特定のデータを読み込んで表示する必要があります。
AngularJS でこれを行う最善の方法は何ですか?
これまでのところ、私は持っています:
- $routeProvider.when()の使用を除外しました。3 つのビューを更新する必要があり、
$routeProvider
サポートされるのは 1 つだけだからngView
です。 - 現在のパスを監視し、$rootScope.$broadcast()を使用してパスが変更されたことをコントローラーに警告するSERVICEを作成しました。
- (または、#2 の代わりに) #2と同じことを行うコントローラーを作成しました。
- $scope.$on()を使用して #2 または #3 によってブロードキャストされたイベントをキャッチしました (これはビュー コントローラーで行います)。
この種の作品ですが、いくつかの問題があります。
- 「パス変更」イベントは、特に最初のページ読み込み時に、イベント リスナーが配置される前にブロードキャストされることがよくあります。これはおそらく、ビュー テンプレートがサーバーから読み込まれ、テンプレートの読み込みが完了する前にリスナーを設定できないことが原因です。
- AngularJS でパスの変更を監視するためのより効率的/自動化された方法はありませんか? (以下の私のコードを参照してください。かなり「手動」のようです。)
- パスの変更を監視するコードは、SERVICE または CONTROLLER に属しますか? (コントローラーはビューに動作を追加するためのものなので、サービスに傾倒します。)
- ビューが「パス変更」イベントをキャッチすることを保証するにはどうすればよいですか? そもそもイベントを使用する必要がありますか? (たぶん、パスをサービスに保存し、代わりにビューにサービスを監視させることができますか?)
パスの変更を監視するコード (これをサービスまたはコントローラーに入れます):
var watchExpression = function() { return $location.path(); };
var listener = function(newPath, oldPath) {
// Broadcast event on $rootScope
$rootScope.$broadcast('PathChanged', newPath);
};
$rootScope.$watch(watchExpression, listener);
次に、View Controller でイベントをキャッチします。
$scope.$on('PathChanged', function(event, path) {
// Update view based on new path.
});
どんな助けでも感謝します。ありがとう。