Позвоночник.JS listenTo window resize throwing [object Object] не имеет ошибки метода " применить
:
Я пытаюсь прикрепить событие изменения размера к окну из представления, используя новый метод listenTo () в магистрали.js. Кажется, что событие привязывается к окну, однако, когда окно фактически изменяется, возникает следующая ошибка:
непойманные ошибку TypeError: объект [объект] не имеет метода 'применить' на jQuery.ДШ:2 стр. событие.отправка на jQuery.ДШ:2 стр. событие.добавлять.г.ручка.h
вот код, который присоединяет событие к представлению:
this.listenTo($(window),"resize", this.resizeContext, this));
вот функция resizeContext:
resizeContext: function(event) {
console.log("resizing context for "+this.id);
this.setHeight();
// trigger resize event (use event bus)
this.options.vent.trigger("resize", event);
}
Примечание: используя стандартный $(window).on("resize",this.resizeContext)
присоединяет событие и работает так, как должно. Я пытаюсь воспользоваться новым stopListening()
функция, которая добавляется к view.remove();
3 ответов
новая listenTo
и stopListening
методы Backbone.Events
mixin, и они могут использоваться только для прослушивания событий магистрали, которые запускаются с .trigger
, например, встроенный collection:add
или model:change
событий.
это означает, что вы не сможете использовать stopListening
функциональность для событий DOM, таких как window:resize
.
попробуйте переопределить View.remove
метод вместо этого.
var SomeView = Backbone.View.extend({
initialize:function() {
$(window).on("resize",this.resizeContext)
},
remove: function() {
$(window).off("resize",this.resizeContext);
//call the superclass remove method
Backbone.View.prototype.remove.apply(this, arguments);
}
});
если вы хотите продолжать использовать listenTo
вы можете использовать следующую одну оболочку для элементов DOM:
/**
* Use Backbone Events listenTo/stopListening with any DOM element
*
* @param {DOM Element}
* @return {Backbone Events style object}
**/
function asEvents(el) {
var args;
return {
on: function(event, handler) {
if (args) throw new Error("this is one off wrapper");
el.addEventListener(event, handler, false);
args = [event, handler];
},
off: function() {
el.removeEventListener.apply(el, args);
}
};
}
пример:
view.listenTo(asEvents(window), "resize", handler);
и слушатель будет автоматически удален на view.remove()
или view.stoplistening()
вот более сложная реализация для нескольких прослушивателей событий https://gist.github.com/epeli/5927950
в моем коде мне нужно сделать .debounce ((это.resizeContext).bind(this)).
что затрудняет отключение. В качестве грязного решения я просто отключаю все прослушиватели "изменения размера" при удалении представления. Я думаю, в новом представлении, если есть прослушиватель изменения размера, он будет включен снова.
remove: function() {
$(window).off("resize");
//call the superclass remove method
Backbone.View.prototype.remove.apply(this, arguments);
}