19

にレンダリングされているページのコントローラーがあるとしますng-view

このコントローラーは、外部ソース(アプリケーション全体のメッセージバスなど)の一部のイベントにバインドして、モデルを更新します。これは基本的に非常に簡単に機能します。

function MyController ($scope) {
  $scope.bar = '…';

  externalSource.on('foo', function (data) {
    $scope.$apply(function () {
      $scope.bar = data.bar;
    });
  });
}

問題は次のとおりです。関連付けられているビューが表示されなくなったら、コントローラーを外部ソースからバインド解除するにはどうすればよいですか?

イベントなどはありdisposeますか?

それとも私のアプローチは完全に間違っているので、どういうわけかそのようなことを扱う必要がありますか?もしそうなら、どのように?

4

2 に答える 2

35

コントローラのスコープが破壊されたときにイベントのバインド解除を実行するには、次を使用します。

$scope.$on('$destroy', function () { /* Unbind code here */ });

詳細については、スコープのドキュメントを参照してください

于 2013-03-17T16:15:33.633 に答える
3

$routeChangeStartまたは$routeChangeSuccessイベントを使用します。

function MyController ($scope) {
  $scope.bar = '…';

  externalSource.on('foo', function (data) {
    $scope.$apply(function () {
      $scope.bar = data.bar;
    });
  });

  $scope.$on('$routeChangeStart', function(next, current){
    // unregister listener
    // externalSource.off ....
  });
}

...または$destroyイベント:

  $scope.$on('$destroy', function(){
    // unregister listener
    // externalSource.off ....
  });
于 2013-03-17T14:58:34.353 に答える