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" }, 
     ... 
  ]
}

params: { deep: true }更新 ($http PUT) 呼び出しについては、コードと呼び出しを最小限に抑えるためのショートカットとして使用したいと考えてい$httpます。

現時点での問題は、PUT コマンドがデータベース内の「マスター」オブジェクトを更新している間、編集された「子」オブジェクトは更新されず、新しい子オブジェクトとして追加されることです。

たとえば、マスター オブジェクトと子オブジェクトを 1 回の呼び出しで更新しようとすると、次のようになります。

$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 = truePUT でも動作しますか? Backand docsはそれについて言及していません。

4

1 に答える 1

3

Backand は、既存のオブジェクトをそのオブジェクトに従って識別します。

{
   __metadata: {id: "6"}
} 

Back からオブジェクトを「GET」すると、そのようなメタデータが含まれます。メタデータ ID なしでオブジェクトを「PUT」すると、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 に答える