我可能因为缺乏对Backbone的事件机制的理解而导致麻烦。
要么以前的事件仍然附加,当前事件没有被解雇。
如果我不使用$('body').off()
或this.$el.off()
(我的目标是body
),显然一切都是因为Backbone
的事件模特附加&听取body
上传播的内容。
如果我在$('body').off()
方法中使用this.$el.off()
或initialize
,请执行以下操作:
module.exports = Backbone.View.extend({
initialize: function(){
this.KontaktViewTemplate = $.ajax({ url:'index.php/templateget/kontakt', dataType:'text', cache:true});
this.$el.off();
this.render();
},
render: function(){
var $el = this.$el;
this.KontaktViewTemplate.done(function(text){
$el.html(text);
});
},
events: {
'click div': "Alert"
},
Alert: function(){
alert('Example');
}
});
我甚至没有让'click div': "Alert"
工作。
我最好猜测,即使在调用View
方法之前,Backbone initialize
的事件也会被附加,因此.off()
调用来得太迟并将其清除。
我应该在Backbone之外处理这个吗?
答案 0 :(得分:0)
Backbone View的事件只是命名空间的jQuery事件(source)。
delegate: function(eventName, selector, listener) { this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener); return this; },
它们在setElement
function(source)内委托,该_ensureElement
remove
在initialize
中在{1}}之前在View的构造函数中调用。
如果元素与多个Backbone Views共享,或者您在多个位置重复使用相同的视图,则可能会遇到仍附着或加倍的事件的问题。
假设您的观点与默认值一样为div
,您希望它使用现有元素<div id="existing"></div>
并且该div已经附加了事件。
你会做类似的事情:
view.setElement($('#existing'));
setElement
将首先取消view
中的事件。其他地方附带的任何活动仍将附上。然后,它委派来自events
视图属性的事件。
此外,在视图上调用source(enter image description here)将明确取消附加到该元素的任何事件。