2014-01-31 78 views
0

我有一個預加載的骨幹集合和模型的對象圖。要初始化我的用戶界面,我需要確保集合已加載,然後使用get()通過ID從它們中拉出一些項目。我想要一個接受回調的方法,如果集合已加載,則該回調要麼立即調用,要麼延遲到集合被加載。jQuery.ready(fn)用於Backbone集合和模型

到目前爲止,我有一個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甚至沒有一個基本的信號變量來告訴我該對象是否同步,這看起來完全荒謬。

完成此操作的理智方式是什麼?每次我想爲我的UI集合中的對象get()時,我都不想撥打fetch(),因爲這首先破壞了預先加載對象圖的目的。

回答

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/

+0

我已經在使用這種方法,但是我需要做一個'Collection#get()',它不會做承諾包裝 - 它只是給了我'未定義的',如果物品尚未到達。 – Julik

+0

你可以在上面完成的'done'回調中完成(我編輯了我的anser),或者實現類似上面的'getIfLoaded'的東西。 –

+0

這是我結束了,謝謝。也許我只需要在當前應用程序狀態的所有'fetch()'承諾都爲'done()'時分割'fetch()'和'get()'的承諾步驟並執行'get ' - 在'then()'中加上它 – Julik

相關問題