3

UI-Router を使用して、アプリケーションにいくつかの「メニュー」を追加しています。

$stateProvider.state("list"
    url: "/Focales"
    templateUrl: "/demo/focals.html"
    controller: FocalCtrl)
  $stateProvider.state("collection"
    url: "/Collections"
    templateUrl: "/demo/collections.html"
    controller: CollectionCtrl)

私の CollectionCtrl では、サーバーで行われた処理をトリガーし、このような情報を表示するのを待っています (CoffeeScript)

Progress = $resource('/collections/getProgress')

$scope.getProgress = () ->
    prg = Progress.get {}, ->
        $scope.currentProgress = prg
        $scope.getProgress() if prg.end isnt true

私の問題: ユーザーが Focal に移動して CollectionCtrl に戻ると、CollectionCtrl の新しいインスタンスが作成されます。私が理解している限り、 $scope.getProgress コードは引き続きデータを受け取りますが、 PREVIOUS CollectionCtrl の場合 (表示は更新されません...)

CollectionCtrl の新しい「インスタンス」ではなく、以前の Controller を取得することは可能ですか? 新しい CollectionCtrl が作成されるのはなぜですか? 最良のアプローチは何ですか: $scope.currentProgress = prg ではなく $state.currentScope = prg を実行できるように、現在の $scope を格納する状態データを取得したいと考えています。それは良いアプローチですか?

ありがとう !

4

1 に答える 1

2

ここで行う最善の方法は、サーバーと通信し、場合によっては結果をキャッシュするサービスを定義することです。このサービスはコントローラーに挿入でき、コントローラーはおそらく を使用して進行状況$watchを要求できますが、サービスにコールバックを提供することで十分な場合もあり、それに基づいて UI を更新します。

コントローラーは一時的であるべきであり、Angular のシングルトンのようなオブジェクトであることに依存すべきではありません。重要なのは、サポートしているテンプレートで必要とされるもの以外の状態を含めないことです。ルートがアクティブになったときに再度作成されるため、比較的単純なコードを記述し、$scope一度初期化して、可能な限りテンプレートの新しい情報 (ルートに関する) が含まれていることを確認できます。これにより、コントローラーがルートごとに保持され/app/:object_id、ユーザーがルートを頻繁に切り替える場合のメモリリークも回避されます。

于 2013-11-10T19:09:18.747 に答える