Nienawidzę umieszczania tego pytania (wraz z innymi milionami pytań typu „wyzwalanie zdarzeń”), ale z jakiegoś powodu inne pytania i odpowiadające im odpowiedzi nie działają dla mnie.

Oto znacznik szablonu w skrypcie „text/template” o identyfikatorze „display_template”

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

To jest mój widok Backbone w 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'

Aktualizuj

Wygląda na to, że mogę nie tworzyć poprawnie wystąpienia widoku, jest on ustawiany z kolekcji i widoku kolekcji.

  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

Jeśli usunę selektor css ze zdarzenia kliknięcia, metoda „kliknięta” zostanie uruchomiona dla określonego widoku, ale przestanie działać po dodaniu selektora css. Podejrzewam, że może to mieć coś wspólnego z nieprawidłowym przypisaniem @el, ale jestem zakłopotany i miałem nadzieję, że ktoś wskaże mi właściwy kierunek dzięki mojej specyficznej składni.

0
Justin Soliz 27 luty 2012, 22:32

2 odpowiedzi

Najlepsza odpowiedź

Rzućmy okiem na źródło Backbone. W metodzie delegateEvents mamy:

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

Mówisz, że kiedy nie ma selektora, twój kod działa; ale gdy selektorem jest '.remove', tak nie jest.

Jedna możliwość: używasz starej wersji jQuery. delegate został dodany w wersji 1.4.2.

Inna możliwość: może istnieć inny program obsługi zdarzeń, powiązany gdzie indziej, który wykonuje preventDefault lub zwraca false, zapobiegając rozprzestrzenianiu się zdarzenia do el. Aby je znaleźć, użyj inspektora przeglądarki i przejdź do sekcji „Odbiorniki zdarzeń” na łączu .remove i we wszystkich elementach wokół niego.

1
Trevor Burnham 28 luty 2012, 04:36

Sprawdź, czy dodanie wywołania „preventDefault” pomoże:

clicked: (event) ->
  event.preventDefault()
  console.log 'clicked'
0
Jake Feasel 28 luty 2012, 02:52