Проблема делегирования события магистрали - PullRequest
0 голосов
/ 31 декабря 2011

У меня есть представление с достаточно простым объектом событий (в coffeescript, потому что это мило)

APP.bb.Recipe_Index = Backbone.View.extend

    template: JST['templates/Recipe_Index']

    el: $ "#recipes"

    events:
        'click a' : 'testFunction'

    testFunction: () ->
        console.log 'test called'
        return 'this function'

Мои события не связаны. Когда я попадаю в строку 967 в файле Unifiedified 0.5.3 Backbone.js

delegateEvents : function(events) {
  //snip
  for (var key in events) {
    var method = this[events[key]];
    if (!method) throw new Error('Event "' + events[key] + '" does not exist');
    var match = key.match(eventSplitter);
    var eventName = match[1], selector = match[2];
    method = _.bind(method, this);
    eventName += '.delegateEvents' + this.cid;
    if (selector === '') {
      $(this.el).bind(eventName, method);
    } else {
      $(this.el).delegate(selector, eventName, method);  <-- THIS ONE
    }
  }
},

Это приводит к неправильному синтаксису jQuery, когда в Chrome установлена ​​точка останова:

selector == 'a'
eventName == click.delegateEventsview8'
method == 'function() {[native code]}'

Селектор правильный, но я не уверен, почему в строке 963 есть добавление к моей строке 'click', которая указывает тип события. Метод считывается как мой console.log метод до того, как он будет связан с подчеркиванием, так что это правильно.

Конечным результатом является то, что мои события не запускаются. Интересно, что я тут неправильно понял.

Спасибо за любой вклад!

1 Ответ

3 голосов
/ 31 декабря 2011

Имя события click.delegateEventsview8 на самом деле является правильным значением для события jQuery. Backbone использует функциональность событий пространства имен jQuery. ( Подробнее об этом можно прочитать здесь )

Backbone использует события пространства имен, поэтому он может легко отменить привязку всех событий, которые он добавил в своей функции undelegateEvents. Используя пространство имен, Backbone может быть уверен, что он отменяет привязку только к событиям, которые он добавил. Таким образом, он не будет связывать события, которые он не добавил.

undelegateEvents : function() {
  $(this.el).unbind('.delegateEvents' + this.cid);
},

Что касается того, почему событие не вызвано, я не знаю.

Попробуйте вручную добавить событие click в вашем методе рендеринга после того, как шаблон будет отображен в el представления и посмотрите, вызывается ли он тогда. Если нет, то вы знаете, что с селектором что-то не так.

render: function() {
  $(this.el).append(//your template code)
  this.$('a').click(this.testFunction);
}
...