我有一个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函数工作正常,但触发器失败。
有什么想法吗?成功和错误处理程序的工作非常出色。
答案 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
。