【问题标题】:BeforeSend passed to Backbone's Fetch not allowing events to be triggeredBeforeSend 传递给 Backbone 的 Fetch,不允许触发事件
【发布时间】:2012-05-03 07:46:43
【问题描述】:

我有一个 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 函数工作正常,但触发失败。

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

【问题讨论】:

    标签: events backbone.js coffeescript backbone-events


    【解决方案1】:

    您在initialize 方法中调用fetch,因此在触发事件之前没有任何机会绑定到该集合。 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

    【讨论】:

    • 我爱你。我是否可以在对象中设置另一个函数以在获取之前等待一个滴答声,并且在对象初始化时仍然具有获取的好处?
    • @RandallB:initialize 中的旧 setTimeout(..., 0) 技巧应该可以工作,只要调用者在实例化集合后立即绑定他们的事件处理程序(并且您可能想要记录此行为)。
    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多