2011-05-09 73 views
14

我有一個情況使用backbone.js,我有一個模型集合和一些關於模型的附加信息。例如,假設我要返回一個金額列表:他們有一個與每個模型相關的數量。現在假設每個金額的單位總是相同的:說夸脫。然後JSON對象我從我的服務回報可能是這樣的:在backbone.js集合中持久保存和加載元數據

{ 
    dataPoints: [ 
     {quantity: 5 }, 
     {quantity: 10 }, 
     ... 
    ], 
    unit : quarts 
} 

現在骨幹收藏有本身這個元數據與採集相關聯沒有真正的機制,但有人建議我在這個問題: Setting attributes on a collection - backbone js,我可以用.meta(property, [value])樣式函數擴展集合 - 這是一個很好的解決方案。但是,自然會出現這樣的結果,我們希望能夠從上面的json響應中清楚地檢索這些數據。

Backbone.js爲我們提供了parse(response)函數,該函數允許我們指定從何處提取集合的模型列表,並結合url屬性。但是,我沒有辦法知道如何在不超載的情況下製作更智能的功能fetch(),該功能可以刪除已經可用的部分功能。

我的問題是:有沒有比重載fetch()(並試圖將其稱爲超類實現)更好的選擇來實現我想要實現的目標?

感謝

回答

22

就個人而言,我想包內的另一個ModelCollection,然後覆蓋parse,就像這樣:

var DataPointsCollection = Backbone.Collection.extend({ /* etc etc */ }); 
var CollectionContainer = Backbone.Model.extend({ 
    defaults: { 
     dataPoints: new DataPointsCollection(), 
     unit: "quarts" 
    }, 
    parse: function(obj) { 
     // update the inner collection 
     this.get("dataPoints").refresh(obj.dataPoints); 

     // this mightn't be necessary 
     delete obj.dataPoints; 

     return obj; 
    } 
}); 

Collection.refresh()調用更新用新值模型。按照之前的建議將自定義meta值傳遞給集合可能會阻止您能夠綁定到這些元值。

+0

我知道這違背了你在你鏈接的其他後得到了答案,但集合不會擁有模型的所有屬性,比如'parse',能夠覆蓋。如果集合需要元數據有意義,那麼不妨反映在Backbone提供的對象結構中,而不是使用元上集合解決方案「IMO帶外」。 – Stoive 2011-05-09 04:23:57

+0

這對我來說似乎很合理。關鍵在於能夠重寫模型對象以及集合上的parse/url/fetch。非常感謝。 – idbentley 2011-05-09 13:33:58

+6

現在不推薦使用Collection.refresh(),而是使用Collection.reset()。 – JMWhittaker 2012-07-09 18:06:52

0

此元數據不屬於集合。它屬於代碼的名稱或其他描述符。你的代碼應該聲明地知道它所擁有的集合只含有石英元素。自從url指向石英元素以來,它已經做到了。

var quartzCollection = new FooCollection(); 
quartzCollection.url = quartzurl; 
quartzCollection.fetch(); 

如果你真的需要得到這個數據爲什麼你不只是調用

_.uniq(quartzCollecion.pluck("unit"))[0];

+0

該單元在AJAX調用之前未知。我不使用'pluck',因爲它會要求我的集合中的每個模型對象存儲單元 - 這會導致響應的大小比僅將它作爲元數據關聯一次大。另外,執行像我懷疑的操作還有很大的開銷。 – idbentley 2011-05-09 13:37:41

+0

@idbentley我雖然{dataPoints:...,unit}是模型。它是什麼。只是dataPoints是一個集合。所以對待它就像在@Stoive答案中提到的那樣。拔毛操作也不是那種花費。它只是將模型映射到單位。 – Raynos 2011-05-09 13:47:35