Вопрос по javascript – Лучший способ отменить делегирование событий, когда представление больше не нужно

11

Это плохая практика, чтобы звонитьundelegateEvents() в представленииremove() метод? Почему ребята из магистрали не включили его по умолчанию?

Я понял, что попадаю в очень много проблем связывания, когда просто переинициализирую переменную представления. ХотяundelegateEvents() вызывается автоматически при создании нового представления, оно пытается отменить делегирование событий для нового экземпляра, а не предыдущего. Поэтому, если вручную не вызывать его каждый раз, обратные вызовы событий-призраков остаются живыми и портят мои приложения.

Какой лучший способ справиться с этим?

Вы повторно используетеel при переключении видов, а не при создании новых? JQuerydelegate связан с представлениямиel. mu is too short
связанные с?stackoverflow.com/questions/10429648/… fguillen
Если у вас есть обычайremove() метод, пожалуйста, напишите это в вашем вопросе. JMM
@muistooshort Да, я часто использую один и тот же DOM-контейнер и предоставляю его представлению вместо того, чтобы создавать и присоединять новый. Вот почему удаление обратных вызовов имеет решающее значение Preslav Rachev
Потом звонюundelegateEvents во время уборки стоит ожидать и нормально.remove Безразлично & APOS; тundelegateEvents потому что это убивает целоеel и не будет никакого смысла. mu is too short

Ваш Ответ

1   ответ
6

Is it a bad practice to call undelegateEvents() in the view remove() method?

В этом нет необходимости, если вы не реализуете свои собственныеremove() и вы не звонитеBackbone.View.remove() или жеthis.$el.remove(), Это, если вы, по крайней мере, используете jQuery. призваниеremove() на позвоночнике позвонитjQuery.remove() который в любом случае удалит все прослушиватели DOM.

I realized I am falling into so many binding issues, when simply reinitializing a view variable.

Многие люди, похоже, используют Backbone. Такие события, как это какая-то магия, которую им не нужно очищать, например:

var View = Backbone.View.extend( {

  initialize : function ( options ) {

    // `on()` or `bind()`

    this.model.on( 'something', this.render, this );

  }

} );

Смотрите мой ответ наДелегирование событий родительскому представлению в Backbone

Возможно ли, что проблемы с призраками, которые вы испытываете, связаны с событиями Backbone, а не с событиями DOM?

Если вы держите объект модели вокруг, но хотите избавиться от этого объекта представления или его регистрации событий Backbone, вам нужно сделатьview.model.off( null, null, this );, Вы должны отменить привязку событий, которые вы зарегистрировали, к любым внешним объектам. Если вы хотите, вы можете переопределитьBackbone.View.remove() и сделать это там, но по умолчанию этот метод является просто сокращением дляview.$el.remove().

Похожие вопросы