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 回答