我正在研究一个嵌套的骨干视图,如果你点击它,它将创建一个相同视图的新实例。我想只禁用特定事件,而不是所有事件;在这种情况下,点击。我尝试使用undelegateEvents(),但这将禁用所有功能。关于如何做到这一点的任何想法?
以下是我正在处理的一段代码:
var View = Backbone.View.extend({
events: {
"mousedown": "start",
"mouseup": "over"
},
start: function() {
var model = this.model;
var v = new View({
model: model,
});
v.undelegateEvents(); //I just want to disable mousedown
v.render();
},
over: function() {
/*
some code here
*/
},
render: function() {
/*
some code here
*/
}
});
这个想法是禁止在保留其他事件的同时点击第二个实例化视图。第一个将有它的所有事件。
由于
答案 0 :(得分:7)
您可以在拨打delegateEvents
时指定要使用的事件:
delegateEvents
delegateEvents([events])
使用jQuery的
delegate
函数为视图中的DOM事件提供声明性回调。如果未直接传递事件哈希,请使用this.events
作为源。
所以你可以这样做:
var v = new View({
model: model,
});
v.undelegateEvents();
var e = _.clone(v.events);
delete e.mousedown;
v.delegateEvents(e);
v.render();
您可能希望将该逻辑推送到View上的方法:
detach_mousedown: function() {
this.undelegateEvents();
this.events = _.clone(this.events);
delete this.events.mousedown;
this.delegateEvents();
}
//...
v.detach_mousedown();
当您只想为一个对象更改它时,您需要this.events = _.clone(this.events)
诡计以避免意外更改“类”events
(即this.constructor.prototype.events)。您还可以为View
构造函数设置一个标记,该标记在initialize
内执行类似的操作:
initialize: function() {
if(this.options.no_mousedown)
this.detach_mousedown()
//...
}
另一种选择是拥有一个没有mousedown
处理程序的基本视图,然后将其扩展到具有mousedown
处理程序的视图:
var B = Backbone.View.extend({
events: {
"mouseup": "over"
},
//...
});
var V = B.extend({
events: {
"mousedown": "start",
"mouseup": "over"
},
start: function() { /* ... */ }
//...
});
您必须在B.events
内复制V
内的extend
或events
手册{{1}},因为_.extend
不会合并属性,它只是替换批发的东西。
答案 1 :(得分:1)
这是一个简单的示例,演示如何在Backbone视图中委派或取消内容事件
Backbone.View.extend({
el: $("#some_element"),
// delete or attach these as necessary
events: {
mousedown: "mouse_down",
mousemove: "mouse_move",
mouseup: "mouse_up",
},
// see call below
detach_event: function(e_name) {
delete this.events[e_name]
this.delegateEvents()
},
initialize: function() {
this.detach_event("mousemove")
},
mouse_down: function(e) {
this.events.mousemove = "mouse_move"
this.delegateEvents()
},
mouse_move: function(e) {},
mouse_up: function(e) {}
})