2015-01-12 69 views
1

我正在將我的餘燼數據存儲緩存到本地存儲。在第一次加載時,我查詢服務器將數據加載到存儲中,然後將其加載到本地存儲中。在後續的頁面加載中,我從localstorage中提取數據並將其加載到商店中。我可以使用pushMany方法做到這一點。如何從ember-data存儲中提取標準化數據?

該商店的pushMany方法需要標準化的數據。將來自服務器的有效載荷通過模型序列化程序進行標準化。一旦規範化的數據存儲在商店中,似乎有理由相信應該有可能將規範化的數據提取出來。

那麼,如何從商店中提取標準化數據?

每種型號都有一個_data屬性。 '_data'屬性只適用於平面模型。更復雜的模型_data屬性包含實例化的關係。

我想避免不止一次序列化/反序列化。

This是我目前的實現。 toJson方法的問題是它必須加載所有關聯,包括尚未解析的異步關係。我認爲有一個根本問題是關於如何用數據解析關係主鍵/外鍵。

+0

我不知道如果這是你的意思,但你可以從商店記錄,而不使用所有發出請求的服務器 - 通過http://emberjs.com/guides/models/finding-records /#toc_finding-all-records-of-a-type 「要獲取已加載到商店中的記錄列表,而不發出其他網絡請求,請改爲使用全部。」 'var posts = this.store.all('post');''// =>無網絡請求 – Craicerjack

+0

這裏是一個要點https://gist.github.com/arenoir/528c4d77c9398e519984#file-local-cache- js-L47 –

+0

這適用於沒有關係的模型。國際海事組織應該有一個提取原始標準化數據的模型。 –

回答

2

您的問題的一個好的起點可能是從ember-data中實現toJSON

正如你所提到的,toJSON的問題在於它解決了所有的關聯。對於belongsTo關係,通過使用_data獲取相關對象的ID很容易避免此問題。

customToJSON: function(record) { 
 
    var json = {}; 
 
    json.id = record.get('id'); 
 

 
    var serializer = DS.JSONSerializer.create({ container: record.container }); 
 

 
    record.eachAttribute(function(key, attribute) { 
 
    serializer.serializeAttribute(record, json, key, attribute); 
 
    }, this); 
 

 
    record.eachRelationship(function(key, relationship) { 
 
    if (relationship.kind === 'belongsTo') { 
 
     json[relationship.key] = record._data[relationship.key].id; 
 
    } 
 
    }); 
 

 
    return json; 
 
}

+0

截至今天,我不認爲這個問題有很好的答案。燼數據團隊正在努力。這個快照API看起來很有前途。 https://github.com/emberjs/data/pull/2623。謝謝你的回答,我會獎賞你的獎金。 –