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.
2 odpowiedzi
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.
Sprawdź, czy dodanie wywołania „preventDefault” pomoże:
clicked: (event) ->
event.preventDefault()
console.log 'clicked'
Podobne pytania
Nowe pytania
backbone.js
Backbone.js to framework JavaScript z interfejsem RESTful JSON i jest oparty na paradygmacie projektowania aplikacji model – widok – prezenter (MVP)