/ / Agregator zdarzeń Backbone-on-rails - backbone.js, ruby-on-rails-3.1, coffeescript, eventaggregator, event-listener

Agregator zdarzeń Backbone-on-rails - backbone.js, ruby-on-rails-3.1, coffeescript, eventaggregator, event-listener

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 № 1

Twoja 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.