Событие 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
Как уже было сказано ранее, Angular по-настоящему позаботится о том, чтобы позаботиться о вас. Так что если вы делаете $scope.$on('someEvents', handleSomeEvent);
Если область действия уничтожена (например, при переходе на другую страницу / представление в приложении), событие автоматически удаляется.
Однако важно отметить, что $rootScope
конечно, никогда не разрушается, если вы не выходите из приложения. Так что если вы делаете $rootScope.$on('someEvents', handleSomeEvent);
Вам может потребоваться удалить событие самостоятельно, в зависимости от того, где вы слушаете событие:
- если в
controller
или жеdirective
то вам придется удалить его вручную, иначе каждый раз, когда вы создаетеcontroller
, новое событие будет прикреплено, и такhandleSomeEvent
будет звонить много раз - если в
service
, то вам не нужно удалять его вручную, так как сервисы всегдаsingleton
(обратите внимание, что в Angularservice
,factory
... все заканчиваются тем же)