0

バックボーン コレクションがあります。fetch初期化時にFacebookの投稿をモデルに遅延ロードするために使用しています。

https://gist.github.com/2271437

exports.Collection = class Posts extends Backbone.Collection
  initialize: (models, options) =>
    @id = options.id
    @activeDetails = false
    @on "loadDetails", @loadDetails
    @on "detailsLoaded", @logger
    debug "initialized posts"
    @fetch
      beforeSend: () =>
        console.log "about to fetch..."
        @trigger "postsLoading"
      success: (collection, response) => 
        debug "successfully loaded ajax"
        @trigger "postsLoaded"
      error: (collection, response) => @trigger "postsLoadingError"

奇妙な理由で、beforeSendハンドラーを使用してイベントをトリガーしようとすると、イベントがトリガーされません。私は任意の関数を呼び出すことができますが、関数が を使用しようとする@trigger "eventName"と、私が観察できた方法でイベントが発生することはありません。上記の例では、console.log 関数は問題なく動作しますが、トリガーは失敗します。

何か案は?成功ハンドラとエラー ハンドラは見事に機能します。

4

1 に答える 1

2

fetchメソッド内で呼び出しinitializeているため、イベントがトリガーされる前にそのコレクションにバインドする機会はありません。コレクションのinitializeインスタンスが作成されている間にメソッドが呼び出されます。つまりfetch、コンストラクターが戻る前に呼び出していますが、そのイベントにバインドする前にコレクションのインスタンスが必要です。

次のようなものを検討してください。

class Posts extends Backbone.Collection
  do_things: ->
    @fetch
      beforeSend: () =>
        console.log "about to fetch..."
        @trigger "postsLoading"
      success: (collection, response) => 
        debug "successfully loaded ajax"
        @trigger "postsLoaded"
      error: (collection, response) => @trigger "postsLoadingError"

次に、これを行うと:

p = new Posts
p.on('postsLoading', -> console.log('loading'))     
p.do_things()

postsLoadingイベントが実際にトリガーされていることがわかります。

デモ: http://jsfiddle.net/ambiguous/PDeFg/

この話の教訓は単純です。

fetchイベントリスナーが気になる場合は、コンストラクター内で呼び出さないでください。

于 2012-04-01T07:56:49.697 に答える