29

我想知道是否可以在单行中绑定主干中的多个事件类型。

考虑以下:

var MyView = Backbone.View.extend({
    id: 'foo',
    events: {
        'click .bar': 'doSomething',
        'touchstart .bar': 'doSomething'
    },
    doSomething: function(e) {
        console.log(e.type);
    }
});

基本上我想知道的是是否可以将“click”和“touchstart”的事件绑定组合成一行 - 沿着:

events: { 'click,touchstart .bar': 'doSomething' }

任何建议,将不胜感激。

4

3 回答 3

18

视图 jQuery 事件是不可能的,它是通过delegateEvents. 但是,主干事件是可能的:

book.on("change:title change:author", ...);
于 2012-05-30T08:43:09.773 回答
15

对于任何感兴趣的人,我最终都覆盖delegateEvents了 Backbone.View。

只需修改几行即可获得所需的功能。

您可以在我在 github 上的提交中看到差异

这是delegateEvents修改后的状态:

delegateEvents: function(events) {
    if (!(events || (events = getValue(this, 'events')))) return;
    this.undelegateEvents();
    for (var key in events) {
        var method = events[key];
        if (!_.isFunction(method)) method = this[events[key]];
        if (!method) throw new Error('Method "' + events[key] + '" does not exist');
        var match = key.match(delegateEventSplitter);
        var eventTypes = match[1].split(','), selector = match[2];
        method = _.bind(method, this);
        var self = this;
        _(eventTypes).each(function(eventName) {
            eventName += '.delegateEvents' + self.cid;
            if (selector === '') {
              self.$el.bind(eventName, method);
            } else {
                self.$el.delegate(selector, eventName, method);
            }
        });
    }
}
于 2012-08-30T08:44:38.743 回答
1

我们也可以这样做。具有管理每个事件之间的空间的优势。

Github 在这里提交

直接将其添加到 Backbone 中:

delegateEvents: function(events) {
  events || (events = _.result(this, 'events'));
  if (!events) return this;
  this.undelegateEvents();
  for (var key in events) {
    var method = events[key];
    if (!_.isFunction(method)) method = this[method];
    if (!method) continue;
    var match = key.match(delegateEventSplitter);
    this.delegate(match[1], match[2], _.bind(method, this));
  }
  return this;
}

覆盖委托事件方法:

Backbone.View.prototype.originalDelegateEvents = Backbone.View.prototype.delegateEvents;
Backbone.View.prototype.delegateEvents = function(events) {
    events || (events = _.result(this, 'events'));
    if (!events) return this;
    this.undelegateEvents();
    for (var key in events) {
        var method = events[key], combinedEvents = key.split(',');
        if (!_.isFunction(method)) method = this[method];
        if (!method) continue;

        for(var i = 0, match = null; i < combinedEvents.length; ++i) {
            match = combinedEvents[i].trim().match(/^(\S+)\s*(.*)$/);
            this.delegate(match[1], match[2], _.bind(method, this));
        }
    }
    return this;
};

我们现在可以在一行中管理事件:

events: { 
    'click a[data-anchor], wheel, keydown': 'scroll'
}
于 2016-01-07T10:15:46.473 回答