Подтвердить что ты не робот

Как развязать внешнее событие при уничтожении контроллера/$?

Предположим, у меня есть контроллер для страницы, которая отображается в ng-view.

Этот контроллер связывается с некоторыми событиями внешнего источника (например, с шиной сообщений в целом) для обновления своей модели. Это в основном работает очень просто:

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

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

Проблема заключается в следующем: как отключить контроллер от внешнего источника, если вид, с которым он связан, больше не отображается?

Есть ли что-то вроде события dispose или что-то подобное?

Или мой подход совершенно неправильный, и я должен как-то разобраться с чем-то подобным? Если да, то как?

4b9b3361

Ответ 1

Чтобы выполнить событие unbind, когда область управления уничтожена, используйте:

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

Подробнее см. Scope.

Ответ 2

Используйте события $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 ....
  });