Лучший способ отключить события, когда представление больше не требуется

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

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

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

Ответ 1

Неправильно ли вы вызов undelegateEvents() в методе представления remove()?

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

Я понял, что попадаю во многие проблемы с привязкой, просто переинициализируя переменную вида.

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

var View = Backbone.View.extend( {

  initialize : function ( options ) {

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

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

  }

} );

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

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

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