8

詳細ページからメインページに戻るナビゲーションリンクを挿入する必要があるアプリケーションに取り組んでいます。両方のビューのコントローラーは異なります。$location.path('/')メインページに戻るために使用しています。問題は、このリンクをクリックして戻ると、メイン ページのコントローラが再初期化されることです。これは予期された動作ではありません。同じリンクに戻るときにコントローラーの再初期化を防ぐ方法はありますか?

4

2 に答える 2

5

AngularJS の組み込みルーティング モジュールを使用していると思います。問題のコントローラーがルートに関連付けられている場合、ルートが新しい場所と一致するたびに初期化されます。避けることはできません。コントローラーを複数回作成したくない場合は、ビュー階層の上位に定義する必要があります。たとえば、メインページの構造は次のようになります。

<html>
...
<body>
  <div ng-controller="SharedController">
    ...
    <ng-view></ng-view>
    ...
  </div>
</body>
</html>

ここでSharedControllerは、ユーザーが移動する場所に関係なく、一度だけインスタンス化されます。が占有してng-viewいる の外に移動できますが、これによりスコープの継承が機能しなくなります。つまり、内部のスコープは、 に注入されたスコープからプロトタイプとして継承されません。divSharedControllerng-viewSharedController

ui-router別のオプションは、ネストされた状態の概念を導入するサードパーティ ライブラリを使用することです。これにより、ユーザーがさまざまな子状態にアクセスするときに一度だけインスタンス化されるコントローラーを使用して、親状態を構築できます。

于 2013-09-19T17:52:37.227 に答える
0

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.
}
于 2016-08-06T18:40:13.700 に答える