Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Backbone.js视图中禁用特定事件_Javascript_Backbone.js_Backbone Events - Fatal编程技术网

Javascript 在Backbone.js视图中禁用特定事件

Javascript 在Backbone.js视图中禁用特定事件,javascript,backbone.js,backbone-events,Javascript,Backbone.js,Backbone Events,我正在处理一个嵌套的主干视图,如果单击该视图,它将创建同一视图的新实例。我只想禁用一个特定事件,而不是所有事件;在本例中,单击。我尝试使用undelegateEvents(),但这将禁用所有函数。关于如何做到这一点有什么想法吗 下面是我正在编写的一段代码: var View = Backbone.View.extend({ events: { "mousedown": "start", "mouseup": "over" }, start

我正在处理一个嵌套的主干视图,如果单击该视图,它将创建同一视图的新实例。我只想禁用一个特定事件,而不是所有事件;在本例中,单击。我尝试使用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
        */
    }
});
其思想是禁止在第二个实例化视图中单击,同时保留其他事件。第一个将有它的所有事件


谢谢

您可以在呼叫时指定要使用的事件:

delegatevents
delegatevents([events])

使用jQuery的
delegate
函数为视图中的DOM事件提供声明性回调。如果未直接传递events哈希,则使用
this.events
作为源

所以你可以这样做:

var v = new View({
    model: model,
});
v.undelegateEvents();
var e = _.clone(v.events);
delete e.mousedown;
v.delegateEvents(e);
v.render();
不过,您可能希望将该逻辑推送到视图上的方法中:

detach_mousedown: function() {
    this.undelegateEvents();
    this.events = _.clone(this.events);
    delete this.events.mousedown;
    this.delegateEvents();
}

//...

v.detach_mousedown();
您需要
this.events=\uu0.clone(this.events)
技巧,以避免在仅为一个对象更改“类的”
事件时意外更改它(即this.constructor.prototype.events)。您还可以为
视图
构造函数设置一个标志,该构造函数将在其
初始化
中执行类似的操作:

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() { /* ... */ }
    //...
});

您必须在
V
中复制
B.events
,或者在
events
上手动执行
扩展
,因为它不会合并属性,只会大量替换内容。

下面是一个简单的示例,演示如何在主干视图中委派或取消委派事件

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) {}

})

谢谢你的回答@mu,这很好用。也谢谢你的进一步解释,我从这个答案中学到了一些非常有用的东西。