Нужно ли нам отвязывать прослушиватели событий в директивах, когда angular начинает уничтожать?

В моем приложении есть большая утечка памяти, но я не нашел причин, и вот предыстория.

  • Я использую AngularJS + JQuery (плагины)
  • Многие слушатели связаны следующим образом:

    $(элемент).on("keyup", function() {});

Итак, вопрос

Нужно ли мне отвязывать этих слушателей в директивах, следуя?

scope.$on("$destroy", function() {
    $(element).off();
}); 

Кстати, как вы обычно обнаруживаете утечку памяти в веб-приложении? Я использую профиль Chrome (см. здесь Профилирование производительности памяти), но мне не удалось отследить коды, где происходит утечка памяти. У Вас есть какие-то предложения?

Большое спасибо!


person Edward    schedule 25.07.2013    source источник
comment
Я не думаю, что это необходимо, если вы не привязываете все области видимости к $rootScope.   -  person Rishabh Singhal    schedule 27.07.2013
comment
Вам не нужно их удалять, они обычно являются сборщиком мусора. Однако вы можете захотеть удалить прослушиватели окна, такие как события прокрутки или сообщения, если обработчик взаимодействует с элементами области. См. stackoverflow.com/questions/12528049/   -  person kapex    schedule 18.10.2013


Ответы (1)


Документация Angular для уничтожения области подразумевает, что вам нужно удалить события DOM.

http://docs.angularjs.org/api/ng.$rootScope.Scope#$destroy

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

person Scott Boring    schedule 10.09.2013
comment
Я только что обнаружил, что $destroy evnet на самом деле запускается после того, как дом удален в моем случае :( время, чтобы отправить еще одну ошибку, я думаю - person Blowsie; 25.11.2013
comment
@Blowsie Есть 2 вида события $destroy. один из них — $scope.$on('$destroy',cb), который вызывается перед удалением элемента. Другой — element.on('$destroy',cb), который является событием jQ и вызывается после удаления элемента. Обязательно используйте правильный - person Le Duc Duy; 28.11.2013
comment
$scope.$on('$destroy',cb) срабатывает после того, как содержимое было удалено в моем случае. 1.2.0 - person Blowsie; 28.11.2013