2012-09-11 30 views
7

我有以下Emberjs數據模型:Emberjs數據如何加載的hasMany-數據後

App.File = DS.Model.extend({ 
    like: DS.attr('boolean'), 
    comments: DS.hasMany('App.Comment') 
}); 

App.Comment = DS.Model.extend({ 
    file: DS.belongsTo('App.File'), 
    comment: DS.attr('string') 
}); 

而且隨着預載:

App.store.load(App.File, {id: 1, like: false}); 

現在我想,如果我得到這樣的評論:

var f = App.store.find(App.File, 1); 
var c = f.get("comments"); 

var c是一個空的EmberArray,併發送一個請求到服務器。但我沒有收到請求?爲什麼以及如何做到這一點?我真的不想預先發表評論。

更進一步,如果我添加評論,但也同時更改文件:

f.get("comments").createRecord({comment: "test"}); 
f.set("like", true); 
App.store.commit(); 

兩個請求被髮送到服務器。但是,如果我然後返回以下JSON(文件):

{ "id": 1, like: true } 

我的第一個可見的評論再次消失。爲什麼?我該怎麼做?

感謝您的幫助!

回答

1

關於你的問題的第一部分:你應該填充評論IDS在文件的數據:在需要的時候

App.store.load(App.File, {id: 1, like: false, comments: [1, 2, 3]}); 

這樣的評論將是懶加載。

關於第二部分:您當然不會在您的服務器的回覆中序列化註釋ID,因此當您描述一個空的註釋列表時,註釋將被重置。

您應該至少返回前面顯示的註釋id這兩個問題是關聯的。

+0

感謝您的快速回答。好。沒有其他辦法嗎?這種方式導致更多的數據查詢,這在大多數情況下,我不需要。而且這對第二個問題沒有幫助,因爲對服務器的第一個請求是對文件更新的請求。第二個請求是添加註釋請求。如果我在createRecord之後添加第二個提交命令,可能會起作用。 –

+0

我會優先使用findQuery使用的機制。第一次使用comments屬性時,findQuery將被傳遞給服務器。 –

+1

我遇到了類似的問題。如果不是要求findMany調用的id,而是使用外鍵支持通過findQuery獲取,那將會很好。我決定只在運行findQuery的模型中添加一個「getComments」方法。 – jhorman

0

看起來像部分的答案是在您的適配器中使用DS.Adapter.findAssociation(...)方法。但是,當您從服務器再次加載父記錄時,我遇到了與您相同的問題 - 所有子記錄都會被刪除。

我已經發布my own question,看看我能不能把它整理出來。如果這個問題得到解答,那也可能是你的答案。