2014-11-12 4 views
1

я увидел кусок кода в контроллере недавно пошло что-то вроде:Deregistration обработчиков событий в угловом

.controller('foobar', ['$scope', '$rootScope', function($scope, $rootScope) { 
    var eventHandler = $rootScope.$on('some-event', function() { 
     ... 
    }); 

    // remove eventHandler 
    $scope.$on('$destroy', eventHandler); 
}]); 

Вопросов:

  1. выполняет функцию eventHandler «дерегистрация» на $scope " s $destroy мероприятие необходимо?
  2. Если да, то будет выполнение функции дерегистрации на $scope «s $destroy события был необходим, если 'some-event' был $on$scope вместо $rootScope?
  3. Как узнать, когда мне нужно выполнить функцию дерегистрации? Я понимаю, что отключение или разворачивание событий является общим для очистки в JavaScript, но какие правила я могу узнать, когда это сделать в Angular?

Любые советы по пониманию этого фрагмента/«дерегистрации» будут высоко оценены.

ответ

1
  1. Обработчики событий отменяются только на событие контроллера $destroy, когда он находится на $scope этого контроллера.
  2. Отмена регистрации будет ненужной, если она находится на $scope, так как это обрабатывается для вас угловым.
  3. Обычно, если он не привязан к экземпляру отдельного пользователя element, controller, или service, вы слушаете его тогда, когда вам нужно обрабатывать отмену регистрации.

Хорошим примером является директива, которая регистрирует обработчики событий на $document:

var module = angular.module('test', []); 
module.directive('onDocumentClick', function directiveFactory($document) { 
    return { 
     link: function (scope, element, attrs) { 
      var onDocumentClick = function() { 
       console.log('document clicked') 
      }; 

      $document.on('click', onDocumentClick); 

      // we need to deregister onDocumentClick because the event listener is on the $document not the directive's element 
      element.on('$destroy', function() { 
       $document.off('click', onDocumentClick); 
      }); 
     } 
    }; 
}); 
4

В приведенном выше примере необходим метод уничтожения. Слушатель связан с $rootscope, что означает, что даже после того, как контроллер получает $destroy, слушатель все еще прикрепляется к dom через $rootscope. Каждый раз, когда создается экземпляр контроллера, создается новый обработчик событий, поэтому без метода уничтожения у вас будет утечка памяти.

Однако, если вы свяжете слушателя к контроллерам $scope он будет разрушаться вместе с контроллером, как $ сфера разрушается, так что слушатель не имеет никакого отношения к йот, тем самым делая его пригодным для сбора мусора

Смежные вопросы