Odsprzęgłem poglądy, na które chcę odpowiedziećnawzajem. Dodałem agregator zdarzeń w pliku application.js i wywołałem zdarzenie z mojej funkcji w pierwszym widoku. Wydaje mi się, że drugi widok nie reaguje na to zdarzenie. Patrzyłem na dyskusję Derrick Bailey na temat agregatorów zdarzeń i dyskusję documentcloud.github.io. Nie byłem w stanie znaleźć składni, która działa z coffeescript i nie jestem pewien, jak przetłumaczyć znalezioną składnię.
Mój pierwszy pogląd, że chcę opublikować wydarzenie, wygląda następująco:
class Mlp.Views.PoniesIndex extends Backbone.View
poniesTemplate: JST["ponies/index"]
events:
"submit #new_pony": "createPony"
"click #pony_up": "ponyUp"
initialize: ->
console.log(Mlp.Collections.Settings)
@collection.on("reset", @render, this)
@collection.on("add", @appendPony, this)
@collection.on("change", @render, this)
ponyUp: (event) ->
event.preventDefault()
Mlp.vent.trigger("ponyUp", @collection)
@collection.ponyDown()
@collection.ponyUp()
Mój agregator zdarzeń znajduje się w pliku application.js:
//= require jquery
//= require jquery_ujs
//= require underscore
//= require backbone
//= require mlp
//= require_tree ../templates
//= require_tree ./models
//= require_tree ./collections
//= require_tree ./views
//= require_tree ./routers
//= require_tree .
Mlp.vent = _.extend({}, Backbone.Events);
Gdy dodam to do pliku application.js, otrzymam dziennik konsoli, który chcę:
Mlp.vent.bind("ponyUp", function(collection){
console.log("pony up!");
});
Ale gdy próbuję dodać segregator zdarzeń w widoku Chcę otrzymać opublikowane wydarzenie, nic nie otrzymuję:
class Mlp.Views.SettingsIndex extends Backbone.View
template: JST["settings/index"]
events:
"submit #new_setting": "createSetting"
"click #change_of_venue": "randomSetting"
initialize: ->
@collection.on("ponyUp", @alterbox, this)
@collection.on("reset", @render, this)
@collection.on("add", @appendSetting, this)
@collection.on("change", @render, this)
alertbox: (collection) ->
event.preventDefault()
console.log("pony up!")
Próbowałem różnych różnych składni, alewciąż nie jestem pewien, czy powinnam być powiązana z kolekcją podczas inicjalizacji, czy wiązać w deklaracjach zdarzeń. W przykładach, które widziałem, używa się podkreślenia _.bindAll. Kiedy próbowałem rzucić „nie można odczytać” powiązania ” of undefined ”, mimo że wymagam podkreślenia w pliku application.js. Jestem pewien, że to podstawowa składnia, której nie rozumiem.
Z góry dziękuję za pomoc!
Odpowiedzi:
0 dla odpowiedzi № 1Twoja kolekcja nie wyśle "ponyUp"
zdarzenie, Twój agregator zdarzeń (Mlp.vent
) Wola. Kiedy to powiesz:
Mlp.vent.trigger("ponyUp", @collection)
Ty pytasz Mlp.vent
wysłać "ponyUp"
wydarzenie z @collection
jako argument „nie wywołujesz "ponyUp"
wydarzenie z @collection
. Oznacza to, że chcesz słuchać Mlp.vent
na wydarzenie i to:
@collection.on("ponyUp", @alterbox, this)
powinien wyglądać bardziej tak:
Mlp.vent.on("ponyUp", @alterbox, this)
Alternatywnie możesz ręcznie uruchomić zdarzenie w kolekcji za pomocą czegoś takiego:
@collection.trigger("ponyUp", @collection)
Główną różnicą między tymi dwoma podejściami jest to, że używa się Mlp.vent
pozwala każdemu słuchać wydarzenia, nawet jeśli nie ma pod ręką kolekcji, podczas gdy @collection.trigger
Podejście wymaga, aby wszyscy mieli odniesienie do kolekcji, zanim będą mogli nasłuchiwać wydarzenia.