お互いのイベントに応答したいビューを切り離しました。application.js ファイルにイベント アグリゲーターを追加し、最初のビューで関数からイベントをトリガーしました。ただし、そのイベントに応答するための2番目のビューを取得できないようです。イベントアグリゲーターに関する Derrick Bailey の議論と documentcloud.github.io の議論を見てきました。coffeescript で動作する構文を見つけることができず、見つけた構文をどのように変換すればよいかわかりません。
イベントを公開する最初のビューは次のようになります。
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()
私のイベント アグリゲーターは 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);
これを application.js ファイルに追加すると、必要なコンソール ログが取得されます。
Mlp.vent.bind("ponyUp", function(collection){
console.log("pony up!");
});
しかし、ビューにイベント バインダーを追加しようとすると、発行されたイベントを受け取りたいので、何も取得しません。
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!")
さまざまな異なる構文を試しましたが、初期化でコレクションにバインドする必要があるのか、イベント宣言でバインドする必要があるのか 、まだわかりません。私が見た例では、アンダースコアの _.bindAll を使用しています。application.js でアンダースコアを必要としているにもかかわらず、「undefined の 'bind' を読み取れません」というメッセージがスローされました。これは、私が理解できない基本的な構文であると確信しています。
助けてくれてありがとう!