使用 $http PUT 更新 Backand 上的复杂对象

Posted

技术标签:

【中文标题】使用 $http PUT 更新 Backand 上的复杂对象【英文标题】:Update a complex object on Backand using $http PUT 【发布时间】:2016-04-08 13:17:38 【问题描述】:

我正在使用 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
  ]

我已经确定子对象的ids 是正确的。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于使用 $http PUT 更新 Backand 上的复杂对象的主要内容,如果未能解决你的问题,请参考以下文章

Backand:西里尔字符串转向?

backand:用户创建、删除、更新的问题

Backand:更新注册用户的电子邮件和姓名

HTTP协议中PUT和POST使用上的区别

将 $scope 更新为特定字段 json ionic backand 导致对象中的空白数据 && 验证用户名密码到来自 backand 的字段

配置安全性以仅允许某些用户更新条目,但允许在 Backand 中读取所有用户