BeforeSend传递给Backbone的Fetch,不允许触发事件

时间:2012-04-01 04:42:01

标签: events backbone.js coffeescript backbone-events

我有一个Backbone集合。我正在使用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函数工作正常,但触发器失败。

有什么想法吗?成功和错误处理程序的工作非常出色。

1 个答案:

答案 0 :(得分: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