Ответ 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()
.