2012-04-04 23 views
13

我正在尋找一個更好的解決方案了兩件事情:Backbone.js的:優雅的方式來檢查數據是否準備就緒,如果數據集是空

  • 我怎麼能當數據被取出並準備好理解,我使用BasicDealList.on("reset", function(){})來了解數據是否從ajax中獲取並解析並準備好使用,但感覺很髒。

  • 如果空JSON來自讀取諸如{},它仍然顯示BasicDealList.length爲1,而它應該是0從而我被迫檢查第一元件經由collection.length == 1 && jQuery.isEmptyObject(BasicDealList.toJSON()[0]這是非常難看是空的。

下面是代碼:

BasicDeal = Backbone.Model.extend();  
BasicDealCollection = Backbone.Collection.extend({ 
    model: BasicDeal, 
    url: '/some/ajax/url/', 
}); 
BasicDealList = new BasicDealCollection(); 

BasicDealList.on("reset", function(collection, response){ 
    isEmpty = collection.length == 1 && jQuery.isEmptyObject(BasicDealList.toJSON()[0]); 
    if (isEmpty){ 
    // render no deal found html 
    } 
    else{ 
    // render list of deals 
    } 
} 
BasicDealList.fetch(); 

回答

25

如果你不喜歡聽的reset,你可以直接傳遞一個回調.fetch()

BasicDealList.fetch({ 
    success: function(collection, response){ 
     // ... 
    } 
}); 

如果,在你隨後的應用程序,你想知道你是否已經獲取數據,你通常可以檢查BasicDealList.length。如果您想避免重複請求服務器上實際爲空的集合,則可能需要制定一個自定義解決方案,例如,在.fetch()設置一個標誌:

BasicDealList.fetch({ 
    success: function(collection, response){ 
     BasicDealList.fetched = true; 
     // ... 
    } 
}); 

至於空數據問題,您應該從服務器,而不是{}被返回[]。骨幹的收集調用this.add(models, ...).reset()之內,並且.add()檢查models參數是否是一個數組;如果它不是,它把它封裝在一個:

models = _.isArray(models) ? models.slice() : [models]; 

所以通過{}將導致models設置爲[{}],這是不是你想要的。如果無法控制服務器,則可以在自定義.parse()方法中檢查{},如果發現該方法,則返回[]

+0

非常感謝您的詳細解釋! – Hellnar 2012-04-04 20:37:32

7

我們需要一種方法來判斷RelationalModel的關係是否已被提取。這是我們的解決方案(在Coffeescript中)。

initialize: (objects, options) -> 
    @fetched = false 
    @listenTo @, 'sync', -> @fetched = true 
12

我知道這個問題已經被回答,但是這裏是一個替代方案。

BasicDealCollection = Backbone.Collection.extend({ 
    model: BasicDeal, 
    url: '/some/ajax/url/', 
}); 

myCollection = new BasicDealCollection() 
deferred = myCollection.fetch() 

$.when(deferred).then(function() { 
    // do stuff when we have the data. 
}); 

這樣做的關鍵好處是我們使用「when」函數。 「when」函數使我們能夠檢查多個獲取調用並取得成功。另外,如果我們將延遲對象存儲到一個變量中,我們可以做這樣的事情。該變量將是一個標誌,讓我們知道我們已經加載了數據。

if (deferred.state() === "resolved") { 
    // do stuff when we have the data. 
} 

當我們在集合上調用fetch()時,它返回一個jQuery延遲對象。一個jQuery延遲對象可以處於3種狀態,「掛起」,「拒絕」或「解決」,一旦我們有數據,它將設置延遲對象的狀態解析。

相關問題