骨干事件委托eventName问题

时间:2011-12-31 07:55:15

标签: javascript javascript-events backbone.js coffeescript underscore.js

我有一个足够简单的事件对象的视图(在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'

我的活动没有受到约束。当我在未公开的0.5.3 Backbone.js文件中到达第967行

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
    }
  }
},

当我在Chrome中设置断点时,最终会出现错误的jQuery语法:

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

选择器是正确的,但我不确定为什么在第963行有一个附加到我的'click'字符串,表示事件类型。该方法在用下划线绑定之前读出为console.log方法,这是正确的。

最终结果是我的事件未被触发。想知道我在这里搞错了什么。

感谢您的任何意见!

1 个答案:

答案 0 :(得分:3)

事件名称click.delegateEventsview8实际上是jQuery事件的正确值。 Backbone正在使用jQuery的命名空间事件功能。 (You can read more about it here

Backbone正在使用命名空间事件,因此它可以轻松取消绑定它在undelegateEvents函数中添加的所有事件。通过使用命名空间,Backbone可以确保它只解除它添加的事件的绑定。这样它就不会解除任何未添加的事件的绑定。

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

至于为什么没有触发事件,我不知道。

在将模板渲染到视图el后,尝试在渲染方法中手动添加单击事件,然后查看是否已调用它。如果没有,那么你知道选择器出了问题。

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