如何在销毁控制器/ $ scope时取消绑定外部事件?

时间:2013-03-17 11:25:05

标签: events controller angularjs

假设我有一个控制器用于呈现为ng-view的页面。

此控制器绑定到外部源(例如应用程序范围的消息总线)的某些事件以更新其模型。这基本上非常简单:

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

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

问题是:如果控制器与其关联的视图不再显示,如何从外部源取消绑定控制器?

是否存在诸如dispose事件之类的东西?

或者我的方法完全错了,我应该以其他方式处理类似的事情?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:35)

要在控制器的范围被破坏时执行事件解除绑定,请使用:

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

有关详细信息,请参阅Scope文档

答案 1 :(得分: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 ....
  });