2013-04-15 40 views
2

我有兩種模式。不能保存hasMany/belongsTo關係如果兩者都是新的Ember-Data

App.Request = DS.Model.extend({ 
    materials: DS.hasMany('App.Material') 
}); 

App.Material = DS.Model.extend({ 
    request: DS.belongsTo('Mat.Request') 
}); 

在表單創建的請求,我創建了一個新的請求:

App.Request.createRecord(); 

,並將其綁定到表單的字段。要創建新材質,請單擊一個按鈕並顯示一個模態。當模態出現,它創建的請求的材料陣列中的一種新材料:(材料模有其自己的控制器,所以我必須要去RequestsNewController得到請求。)

this.get('controllers.requestsNew.materials').createRecord(); 

耶!有用。我可以在請求中添加很多材料,UI正在更新以顯示正在創建關聯。真棒!直到...我打的保存按鈕,呼籲從RequestsNewController此代碼:

this.get('transaction').commit(); 

現在,我已經添加到我的請求,材料被撕掉(該模板,顯示在該部分材料請求現在顯示沒有材料。)

這是我的代碼的一個非常簡化的版本,但重要的是,一切看起來不錯,直到我提交數據到服務器。我有一個關於發生了什麼的理論,但我不知道如何解決它!順便說一下,我在後端使用了主動模型串行器的Rails。

當我調用commit時,其他適配器首先POST到/ requests。記錄被添加,並且我從服務器得到以下內容:

{ 
    "request": { 
     "id": 30, 
     "material_ids": [] 
    } 
} 

Yay!我的請求已保存,並且我現在有一個來自服務器的ID。

接着,REST適配器的POST /材料和它發送以下JSON:

{ 
    "material": { 
     "request_id": 0, 
    } 
} 

並且服務器響應,給予材料的ID。

但這是什麼? REST適配器正在發送request_id:0,而不是request_id:30像它應該那樣?

這是我的理論:請求保存後,服務器響應一個空的material_ids數組。這很有道理!我們還沒有將材料發送到服務器,因爲我們首先需要請求ID!但是,當Ember Data看到一個空的material_id數組時,它將從請求中刪除材料。然後,當材料保存時,他們不再有請求,因此request_id:0.

當我創建沒有材料的請求時,提交,添加材料,提交,它的工作原理!

我在做什麼錯?

謝謝!

+0

我有一個類似的問題,可能你也許告訴你如何可以添加多個材料?我似乎無法得到它的工作。這將非常有幫助。 – Markus

回答

3

我認爲這是目前已知的問題,你的理論是真實的。 ATM,我有兩種解決方法。第一個是嵌入材料中的請求,通過配置這樣的適配器:

DS.RESTAdapter.map('App.Request', { 
    materials: {embedded: 'always'} 
}); 

第二個將是添加觀察者對請求的didCreate事件,加入一旦創建所述材料,並然後再次提交。

下面是相關的當前問題,這個問題:https://github.com/emberjs/data/pull/440https://github.com/emberjs/data/pull/724https://github.com/emberjs/data/issues/437https://github.com/emberjs/data/pull/643

相關問題