Событие angular.js $destroy - нужно ли отменить привязку вручную?

Я пытаюсь выяснить, будет ли угловая основа автоматически связывать наблюдателей и события области видимости, связанные с $scope.$on(...) или же $scope.$watch(...) когда сфера уничтожена?

Предположим, у меня есть следующий код:

$scope.$on('someEvents', handleSomeEvent);
$scope.$watch('someProperty', handleSomePropertyChange);

Нужно ли вручную отсоединять эти наблюдатели и события, когда событие $destroy запускается в области?

3 ответа

Решение

Согласно угловой документации на$scope:

'$ destroy ()' должен вызываться в области, когда желательно, чтобы область и ее дочерние области были постоянно отсоединены от родителя и, таким образом, перестали участвовать в обнаружении изменения модели и уведомлении слушателя путем вызова.

Также

Удаление также подразумевает, что текущая область имеет право на сборку мусора.

Так кажется когда $destroy() называется все наблюдатели и слушатели удаляются и объект, который представлял область видимости становится eligible for garbage collection,

Если мы посмотрим на destroy() Исходный код, мы увидим строку:

forEach(this.$$listenerCount, bind(null, decrementListenerCount, this));

Который должен удалить всех слушателей.

Как упомянуто @glepretre, это относится к наблюдателям и слушателям в контроллере. На той же странице документации, указанной выше, сказано, что:

Обратите внимание, что в AngularJS также существует событие $destroy jQuery, которое можно использовать для очистки привязок DOM перед удалением элемента из DOM.

Так что если у вас есть конкретные слушатели в директивах, вы должны слушать $destroy событие и сделать необходимую уборку самостоятельно

Если сфера находится в контроллере, угловой отсоедините для вас. В противном случае вы можете отменить привязку вашего события, вызвав возвращенную функцию:

var myevent = $scope.$on('someEvents', handleSomeEvent);
myevent() ; // unbind the event

http://docs.angularjs.org/api/ng/function/angular.bind

Как уже было сказано ранее, Angular по-настоящему позаботится о том, чтобы позаботиться о вас. Так что если вы делаете $scope.$on('someEvents', handleSomeEvent);Если область действия уничтожена (например, при переходе на другую страницу / представление в приложении), событие автоматически удаляется.

Однако важно отметить, что $rootScope конечно, никогда не разрушается, если вы не выходите из приложения. Так что если вы делаете $rootScope.$on('someEvents', handleSomeEvent);Вам может потребоваться удалить событие самостоятельно, в зависимости от того, где вы слушаете событие:

  • если в controller или же directiveто вам придется удалить его вручную, иначе каждый раз, когда вы создаете controller, новое событие будет прикреплено, и так handleSomeEvent будет звонить много раз
  • если в service, то вам не нужно удалять его вручную, так как сервисы всегда singleton (обратите внимание, что в Angular service, factory... все заканчиваются тем же)
Другие вопросы по тегам