3

ユーザーがリンクをクリックするたびに$routeProviderを使用して、新しい$scopeが生成されます。つまり、すべてのデータが失われます。Angularに同じコントローラー/$scopeを使用させるにはどうすればよいですか?

説明:

http://jsfiddle.net/mpKBh/1/ (リンクをクリック)

<a href='#'>First controller</a>
<a href='#/view'>Second controller</a>

$routeProvider.
  when('/', { template:"{{$id}}",controller: ContentListCtrl}).
  when('/view', {template:"{{$id}}",controller: ContentDetailCtrl}).

PSどのコントローラーが現在アクティブであるかを知ることは可能ですか?

4

2 に答える 2

4

AngularJS では、アプリケーション全体で持続するデータを保持するためのもので$scopeはありません。そのためには、両方のコントローラーに挿入されるサービスを使用する必要があります。ルート全体で欠落しているデータの詳細を提供する場合は、この回答を修正して、もう少し実用的なものを含めていただければ幸いです.

PSに関して:$routeサービスを注入して、現在のルートに関する情報を取得できます。この$route.current.controllerプロパティは、現在のルートのコンストラクター関数を提供します。

于 2013-03-05T20:33:55.843 に答える
3

AngularJS で「アンバインド」する方法を研究している人にとって、彼はちょっとした情報です (上記の OP の最後のコメントに関連しています)。

ビューが破棄されると、基本的にはガベージ コレクションの対象としてマークされますが、まだ存在しています。スクロールが発生したときに複数のリクエストを受け取るのはそのためです。これは、まだイベントをリッスンしているためです。

したがって、これに対処する最も簡単な方法 (他の方法を学びたいと思いますが、私が見つけたもの) は、 $destroy イベントをリッスンしてそれに反応することです。

$on メソッドによって返されるものへの参照を保持することで、イベントを「アンバインド/アンリッスン」できます。コントローラーから取った例を次に示します。

$scope.systemListener = $rootScope.$on("someEventYouListenTo", function (event, data) {
  console.log('Event received by ' + $scope.name);
});

$scope.$on('$destroy', function () {
    // Remove the listener
    $scope.systemListener();
});

これらの古いスコープ/ビューはイベントに反応しなくなりました。

それが誰かを助けることを願っています!

于 2014-04-17T16:44:38.980 に答える