Subscribed unsubscribe Subscribe Subscribe

Backboneで1つのeventに複数のcallbackを指定

現状だと、オブジェクトリテラルに文字列のセレクタをキーに指定してるので
こんな書き方すると上書きされちゃう

events: {
  'click .button': 'foo',
  'click .button': 'bar'
}

こう書けるようにしたい

events: {
  'click .button': ['foo', 'bar']
}


該当箇所をこんな感じに書き換えたらいける

delegateEvents: function(events) {
  if (!(events || (events = _.result(this, 'events')))) return this;
  this.undelegateEvents();
  for (var key in events) {
    var methods = _.isArray(events[key]) ? events[key] : [events[key]];
    _.each(methods, _.bind(function(method) {
      if (!_.isFunction(method)) method = this[method];
      if (!method) return;

      var match = key.match(delegateEventSplitter);
      var eventName = match[1], selector = match[2];
      method = _.bind(method, this);
      eventName += '.delegateEvents' + this.cid;
      if (selector === '') {
        this.$el.on(eventName, method);
      } else {
        this.$el.on(eventName, selector, method);
      }
    }, this));
  }
  return this;
},


これ既に何回か議論されてて
中の人的に、ハンドラー内に書けば良いって結論に至っていた。
https://github.com/jashkenas/backbone/pull/2650

events: {
  'click .button': 'foobar'
},
foobar: function() {
  this.foo();
  this.bar();
},
foo: function(){},
bar: function(){}


惜しい。。

Backbone.jsガイドブック

Backbone.jsガイドブック