Основное событие для клика WITH CSS селектор не запускается - PullRequest
0 голосов
/ 27 февраля 2012

Я ненавижу ставить этот вопрос там (наряду с другими миллионами «событий, не увольняющих»), но по какой-то причине другие вопросы и их соответствующие ответы не работают для меня.

Вот разметка шаблона внутри тега text / template скрипта с идентификатором display_template

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

Это мой взгляд на Backbone в Coffeescript

$ ->
  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 из события click, метод clicked запускается для конкретного просмотра, но перестает работать, когда я добавляю в селектор css. Я подозреваю, что это может быть связано с тем, что @el неправильно привязан, но я озадачен и надеялся, что кто-то может указать мне правильное направление с моим конкретным синтаксисом.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Давайте посмотрим на источник Backbone.В методе delegateEvents мы имеем:

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

Вы говорите, что когда селектора нет, ваш код работает;но когда селектор равен '.remove', это не так.

Одна возможность: вы используете старую версию jQuery.delegate был добавлен в 1.4.2.

Другая возможность: мог быть другой обработчик событий, связанный в другом месте, который выполняет preventDefault или возвращает false, предотвращая событие отпузырится до el.Чтобы найти их, воспользуйтесь инспектором вашего браузера и перейдите в раздел «Прослушиватели событий» по ссылке .remove и всем, что обернуто вокруг нее.

0 голосов
/ 28 февраля 2012

Посмотрите, поможет ли добавление вызова "protectDefault":

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