詳細ページからメインページに戻るナビゲーションリンクを挿入する必要があるアプリケーションに取り組んでいます。両方のビューのコントローラーは異なります。$location.path('/')
メインページに戻るために使用しています。問題は、このリンクをクリックして戻ると、メイン ページのコントローラが再初期化されることです。これは予期された動作ではありません。同じリンクに戻るときにコントローラーの再初期化を防ぐ方法はありますか?
2 に答える
AngularJS の組み込みルーティング モジュールを使用していると思います。問題のコントローラーがルートに関連付けられている場合、ルートが新しい場所と一致するたびに初期化されます。避けることはできません。コントローラーを複数回作成したくない場合は、ビュー階層の上位に定義する必要があります。たとえば、メインページの構造は次のようになります。
<html>
...
<body>
<div ng-controller="SharedController">
...
<ng-view></ng-view>
...
</div>
</body>
</html>
ここでSharedController
は、ユーザーが移動する場所に関係なく、一度だけインスタンス化されます。が占有してng-view
いる の外に移動できますが、これによりスコープの継承が機能しなくなります。つまり、内部のスコープは、 に注入されたスコープからプロトタイプとして継承されません。div
SharedController
ng-view
SharedController
ui-router
別のオプションは、ネストされた状態の概念を導入するサードパーティ ライブラリを使用することです。これにより、ユーザーがさまざまな子状態にアクセスするときに一度だけインスタンス化されるコントローラーを使用して、親状態を構築できます。
angularプロジェクトに複数のアプリがあったため、ユーザーに表示するアプリを決定する階層のはるか上にng-viewがあるため、上記の回答を実装するのは困難でした。したがって、解決策はサービス内にデータを格納することです。アプリ内を移動するときにサービスが再インスタンス化されないため、データはそのまま残ります。
コントローラー内部、
// Check if data is present in service
if (service.dataModel && service.dataModel.data) {
// insert data in scope variables here
}
else {
// fetch data from server and add data model to service.
}