我有一个Backbone集合和模型的预加载对象图。要初始化我的UI,我需要确保加载集合,然后使用get()
通过ID从它们中提取一些项目。我希望有一个接受回调的方法,如果加载了集合,则立即调用,或者在加载集合之前延迟调用。
到目前为止,我对mixin有如下的憎恶:
window.BackboneReady =
onReady: (cb)->
if @loaded_
console.log "Calling onReady immediately"
cb(@)
else
console.log "Scheduling onReady for later"
@once 'sync', =>
console.log "onReady fired in callback"
@loaded_ = true
cb(@)
然而,它有时只能工作(我看到消息“稍后调度onReady”但我的事件处理程序从未执行过)。 Rant:它看起来Backbone甚至没有一个基本的信号变量告诉我对象是否同步,这看起来完全荒谬。
实现这一目标的理智方法是什么?每次我想要fetch()
我的UI集合中的对象时,我都不想调用get()
,因为这样做会破坏保存预先加载的对象图的目的。
答案 0 :(得分:0)
您可以在自己的收藏中尝试使用承诺并解决您的挑战
initialize: function(){
this.on("request", function(collection, xhr, options){
this.ready = xhr;
});
}
然后你可以做
$.when(myCollection.ready).done(function(){
// do things to the collection that is ready
console.log(myCollection.get(5));
});
或者在你的收藏中:
getIfLoaded: function(id){
if(this.ready.state === "resolved"){
return this.get(id);
}
else{
return null;
}
}
有关延期和承诺的更多信息,请查看http://davidsulc.com/blog/2013/04/01/using-jquery-promises-to-render-backbone-views-after-fetching-data/和http://davidsulc.com/blog/2013/04/02/rendering-a-view-after-multiple-async-functions-return-using-promises/