使用 $http PUT 在后端更新复杂对象
Update a complex object on Backand using $http PUT
我正在使用 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 命令更新数据库中的 "master" 对象时,已编辑的 "child" 对象并未更新,而是作为新的子对象附加。
例如,如果我尝试在一次调用中更新主对象和子对象:
$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
是正确的。
有什么方法可以简洁地做到这一点,还是我只能分多个阶段去做? deep = true
甚至可以与 PUT 一起使用吗? Backand docs就别提了
Backand 根据
识别现有对象
{
__metadata: {id: "6"}
}
当您 "GET" 来自 Back 的对象时,它包含这样的元数据。
当您 "PUT" 一个没有元数据 ID 的对象时,Backand 会将其作为一个新对象进行威胁。
因此,要么使用您最初获得的相同深层对象,要么添加元数据 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" 请求中的子任务,您必须将 overwrite=true 添加到参数中
params: {
deep: true,
overwrite: true
}
我正在使用 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 命令更新数据库中的 "master" 对象时,已编辑的 "child" 对象并未更新,而是作为新的子对象附加。
例如,如果我尝试在一次调用中更新主对象和子对象:
$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
是正确的。
有什么方法可以简洁地做到这一点,还是我只能分多个阶段去做? deep = true
甚至可以与 PUT 一起使用吗? Backand docs就别提了
Backand 根据
识别现有对象{
__metadata: {id: "6"}
}
当您 "GET" 来自 Back 的对象时,它包含这样的元数据。 当您 "PUT" 一个没有元数据 ID 的对象时,Backand 会将其作为一个新对象进行威胁。 因此,要么使用您最初获得的相同深层对象,要么添加元数据 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" 请求中的子任务,您必须将 overwrite=true 添加到参数中
params: {
deep: true,
overwrite: true
}