2016-04-08 22 views
1

我正在使用Backand爲我的Angular應用程序提供數據庫和REST api。

我正在研究用戶對複雜對象進行編輯的功能,然後應該對數據庫進行更新。夠簡單的......

物體看起來有點像這樣:

obj = { 
    id: 1, // assigned by the db 
    name: "My List", 
    tasks: [ 
    { id: 1, desc: "Task 1" }, 
    { id: 2, desc: "Task 2" }, 
    ... 
    ] 
} 

對於更新($ HTTP PUT)電話,我想用params: { deep: true }作爲快捷方式,以儘量減少代碼和$http電話。

此刻的問題是,當PUT命令更新數據庫中的「主」對象時,編輯的「子」對象不會更新,而是作爲新的子對象追加。

舉例來說,如果我嘗試更新主機和子女物體在同一電話:

$http({ 
    method: 'PUT', 
    url: baseUrl + 'lists/' + list.id, 
    params: { 
    deep: true 
    }, 
    data: { 
    id: 1, 
    name: "My To Do List", 
    tasks: [ 
     { id: 1, desc: "New Description for Task 1" }, 
     { id: 2, desc: "New Description for Task 2" } 
    ] 
    } 
}).then(....); 

數據庫無法更新子對象,其追加他們。下面是生成的對象是如何在數據庫:

list = { 
    id: 1, 
    name: "My To Do List", // Updated correctly 
    tasks: [ 
    { id: 1, desc: "Task 1" }, 
    { id: 2, desc: "Task 2" }, 
    { id: 3, desc: "New Description for task 1" }, // Added not updated 
    { id: 4, desc: "New Description for task 2" } // Added not updated 
    ] 
} 

我已經確定了子對象id s爲正確。

有什麼辦法可以簡單地做到這一點,或者我是否已經在多個階段辭職? deep = true甚至可以使用PUT? Backand docs沒有提到它。

回答

3

Backand根據其

{ 
    __metadata: {id: "6"} 
} 

當「GET」從Backand物體它包含這樣的元數據標識現有對象。 當您「放棄」一個沒有元數據ID的對象時,Back並將其威脅爲新對象。 因此,請使用您最初獲得的相同深對象或添加元數據ID。

$http({ 
    method: 'PUT', 
    url: baseUrl + 'lists/' + list.id, 
    params: { 
    deep: true 
    }, 
    data: { 
    "__metadata": { "id": "1" }, 
    id: 1, 
    name: "My To Do List", 
    tasks: [ 
     { "__metadata": { "id": "1" }, id: 1, desc: "New Description for Task 1" }, 
     { "__metadata": { "id": "2" }, id: 2, desc: "New Description for Task 2" } 
    ] 
    } 
}).then(....); 

要刪除任務,孩子們在 「PUT」 要求你必須覆蓋= TRUE添加到PARAMS

params: { 
    deep: true, 
    overwrite: true 
}