Магистраль запускает два метода в одном событии

Я использую Backbone, и у меня есть представление с определенными событиями:

    ....
    events: {
        'click .search-button': 'setModelTerm',
        'change .source-select': 'setModelSourceId',
        'change .source-select': 'activateSource'
    },
    ....

Я хотел бы запустить два метода, когда запускается событие change .source-select. Проблема в том, что последняя запись в объекте события переопределяет предыдущую запись.
Как я могу вызвать два метода в одном событии?
(Я пытаюсь предотвратить использование другого метода, который вызывает эти два метода)

Ответы

Ответ 1

Вы можете передать функцию-оболочку в свой хэш событий, чтобы вызвать два метода.

От http://backbonejs.org/#View-delegateEvents

События записываются в формате {"event selector": "callback"}. обратный вызов может быть либо именем метода на представлении, либо прямым функциональное тело.

Try

events: {
    'click .search-button': 'setModelTerm',
    'change .source-select': function(e) {
        this.setModelSourceId(e);
        this.activateSource(e);
    }
},

Ответ 2

Единственное, что удерживает вас от добавления одной и той же пары событие/селектор, - это то, что events - это хеш - jQuery может обрабатывать несколько привязок к одной и той же паре элемент/событие. Хорошие новости, однако, события jQuery позволяют вам добавлять события в пространство имен, добавляя суффикс .myNamespace. На практике это дает одинаковые результаты, но вы можете генерировать много разных ключей.

var MyView = Backbone.View.extend({
  events: {
    'click.a .foo': 'doSomething',
    'click.b .foo': 'doSomethingElse'
    'click.c .foo': 'doAnotherThing', // you can choose any namespace as they are pretty much transparent.
  },

  doSomething: function() {
    // ...
  },

  doSomethingElse: function() {
    // ...
  },

  doAnotherThing: function() {
    // ...
  },
});

Ответ 3

Хэш хешей событий в вашем представлении - это просто удобство "DSL". Просто привяжите свое второе событие вручную внутри initialize.

events: {
    'click .search-button': 'setModelTerm'
},
initialize: function () {
    _.bindAll(this);
    this.on('click .search-button', this.doAnotherThing);
}