用于Backbone集合和模型的jQuery.ready(fn)

时间:2014-01-31 10:27:08

标签: events backbone.js asynchronous

我有一个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(),因为这样做会破坏保存预先加载的对象图的目的。

1 个答案:

答案 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/