Примечание мы говорим о двух слегка различные виды очистки здесь:
- Функции прослушивателя событий могут потребоваться для очистки.
- Созданные элементы также могут нуждаться в очистке.
В этих случаях Угловое чистит для вас:
// Watching scope vars
$scope.$watch("scopeVariable", function (newVal) { ... });
$scope.$watch("injectedService.serviceVar", function (newVal) { ... });
// Listening to events from a scope
$scope.$on("event", function() { ... });
// Events of the element of a directive,
// within the directive 'link' function (the docs you referenced)
element.on('click', function() { ... });
Во всех этих случаях нет необходимости делать какие-либо очистки. Angular знает, что какой-то код прослушивает события или просматривает переменные и может их отменить. Для элемента, так как он будет удален, все затворы и связанные объекты не будут устранены и, следовательно, позже будут утилизироваться сборщиком мусора.
С другой стороны, в следующих случаях: Угловой не будет делать очистку для вас:
// Listening to events from rootScope
$rootScope.$on("event", function() { ... });
// Subscribing to services events
someInjectedService.subscribeIncomingMessage(function() { ... });
// Adding elements outside directive container element
var body = $document.find('body').eq(0);
var newElement = angular.element('<div></div>');
body.append(newElement);
// Listening to events of elements outside your directive (ie. body)
body.on("click", function() { ... });
В этих случаях Угловой никогда не уничтожить ваши слушатель, ни созданный элемент, добавленный к <body>
документу ,
В сырых словах, я бы сказал, Угловые просто уничтожить все внутри вашей области или , содержащейся в DOM вашего директивы корневого элемента. Все, что вы слушаете, или элементы, которые вы создаете и размещаете вне вашей директивы, - ваша ответственность.
Цитирование угловые документы, вы могли бы сделать очистку путем прослушивания разрушающих событий:
Best Practice: директивы должны убирать за собой. Вы можете использовать element.on('$destroy', ...)
или scope.$on('$destroy', ...)
для запуска функции очистки при при удалении директивы.
Я лично добавляю эти методы только тогда, когда есть что-то для очистки. Вам нужно сделать это специально, если вы создаете элементы реестра для внешних событий (т. Е. Сообщения, поступающие из веб-сокетов или запланированные события таймаута), иначе вы рискуете оказаться в нескольких прослушивателях для одного и того же события (как правило, вызывая неправильное поведение и медлительность).