4

我正在研究一个嵌套的主干视图,如果单击该视图,它将创建同一视图的新实例。我只想禁用特定事件,而不是全部;在这种情况下,单击。我尝试使用 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
        */
    }
});

这个想法是禁止在第二个实例化视图中单击,同时保留其他事件。第一个将包含所有事件。

谢谢

4

2 回答 2

7

您可以在调用时指定要使用的事件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)技巧来避免意外更改“类” (即 this.constructor.prototype.events)。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不会_.extend合并属性,它只是批发替换东西。

于 2012-06-01T21:45:46.673 回答
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) {}

})
于 2013-07-04T14:00:39.777 回答