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的正确性。

有什么方法可以简洁地做到这一点,或者我是否愿意分多个阶段去做?deep = true甚至可以与 PUT 一起使用吗?Backand文档没有提到它。

4

1 回答 1

3

Backand 根据现有对象的

{
   __metadata: {id: "6"}
} 

当您从 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
}
于 2016-04-11T07:20:46.197 回答