Angularjs 使用$http PUT更新背面的复杂对象

Angularjs 使用$http PUT更新背面的复杂对象,angularjs,angular-http,backand,Angularjs,Angular Http,Backand,我正在使用Backand为我的Angular应用程序提供数据库和RESTAPI 我正在开发一种功能,让用户能够对复杂对象进行编辑,然后在数据库中对其进行更新。够直接的了 对象看起来有点像这样: obj = { id: 1, // assigned by the db name: "My List", tasks: [ { id: 1, desc: "Task 1" }, { id: 2, desc: "Task 2" }, ... ] } 对

我正在使用Backand为我的Angular应用程序提供数据库和RESTAPI

我正在开发一种功能,让用户能够对复杂对象进行编辑,然后在数据库中对其进行更新。够直接的了

对象看起来有点像这样:

obj = {
  id: 1,    // assigned by the db
  name: "My List",
  tasks: [
    { id: 1, desc: "Task 1" },
    { id: 2, desc: "Task 2" }, 
     ... 
  ]
}
对于update$httpput调用,我想使用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?不要提及它。

返回并根据其属性标识现有对象

{
   __metadata: {id: "6"}
} 
当您从后台获取一个对象时,它包含这样一个元数据。 当您放置一个没有元数据id的对象时,将其作为一个新对象返回并威胁它。 因此,要么使用最初获得的同一个deep对象,要么添加元数据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请求中的子任务,必须将OVERVERT=true添加到参数中

params: {
    deep: true,
    overwrite: true
}