0

お互いのイベントに応答したいビューを切り離しました。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' を読み取れません」というメッセージがスローされました。これは、私が理解できない基本的な構文であると確信しています。

助けてくれてありがとう!

4

1 に答える 1

0

コレクションはイベントを送信しませんが'ponyUp'、イベント アグリゲーター ( Mlp.vent) は送信します。あなたがこれを言うとき:

Mlp.vent.trigger('ponyUp', @collection)

を引数としてイベントMlp.ventを送信するように求めていますが、からイベントをトリガーしていません。これは、イベントとこれをリッスンする必要があることを意味します。'ponyUp'@collection'ponyUp'@collectionMlp.vent

@collection.on('ponyUp', @alterbox, this) 

次のようになります。

Mlp.vent.on('ponyUp', @alterbox, this)

または、次のような方法でコレクションのイベントを手動でトリガーすることもできます。

@collection.trigger('ponyUp', @collection)

2 つのアプローチの主な違いはMlp.vent、コレクションを手元に持っていなくても、使用すると誰でもイベントをリッスンできるのに対し、この@collection.triggerアプローチでは、イベントをリッスンする前にコレクションへの参照を全員が持つ必要があることです。

于 2013-08-08T21:24:05.110 に答える