单击WITH CSS选择器的主干事件未触发

时间:2012-02-27 18:32:41

标签: backbone.js coffeescript

我讨厌把这个问题放在那里(连同其他百万'事件没有解决问题),但无论出于何种原因,其他问题及其各自的答案对我不起作用。

这里是脚本' text / template'中的模板标记。 id为' display_template'

的代码
<div class="display_data">
    <a class="remove">X</a>
    <div class="grid_6">
            <%= Data %>
    </div>
</div> 

这是我在Coffeescript中的Backbone视图

$ ->
  class window.WebsiteView extends Backbone.View

    displayTemplate: _.template $('#display_template').html()

    events:
      'click .remove': 'clicked'

    render: ->
      $(@el).html @displayTemplate @model.toJSON()
      @

    clicked: ->
      console.log 'clicked'

更新

看起来我可能没有正确地实例化View,它是从集合和集合的视图中设置的。

  class window.Websites extends Backbone.Collection
    model: Website


  class window.WebsitesView extends Backbone.View
    template: _.template $('<div />').html()

    render: ->
      $(@el).html @template
      @collection.each @renderWebsite
      @

    renderWebsite: (website) =>
      website.attributes.Index = @collection.indexOf website

      view = new WebsiteView
        model: website

      $(@el).append view.render().el

如果我从点击事件中删除了css选择器,则点击“&#39;方法将为特定的视图触发,但一旦我添加了css选择器就停止工作。我怀疑它可能与@el没有被正确绑定有关但我很难过,我希望有人可能会用我特定的语法指出我正确的方向。

2 个答案:

答案 0 :(得分:1)

让我们来看看Backbone来源。在delegateEvents方法中,我们有:

if (selector === '') {
  this.$el.bind(eventName, method);
} else {
  this.$el.delegate(selector, eventName, method);
}

你说当没有选择器时,你的代码可以工作;但当选择器为'.remove'时,它不会。

一种可能性:你正在使用旧版本的jQuery。 {1.4}中添加了delegate

另一种可能性:可能有另一个事件处理程序,绑定在其他位置,正在执行preventDefault或返回false,从而阻止事件冒泡到el。要查找这些内容,请使用浏览器的检查器,然后转到.remove链接上的“事件监听器”以及其周围的任何内容。

答案 1 :(得分:0)

查看添加“preventDefault”调用是否有帮助:

clicked: (event) ->
  event.preventDefault()
  console.log 'clicked'