2016-04-08 10 views
1

Ich benutze Backand, um die Datenbank und REST API für meine Angular App bereitzustellen.

Ich arbeite an einer Funktion für Benutzer, um Änderungen an einem komplexen Objekt vorzunehmen, das dann in der Datenbank aktualisiert werden sollte. Einfach genug ...

Das Objekt sieht ein bisschen wie folgt aus:

obj = { 
    id: 1, // assigned by the db 
    name: "My List", 
    tasks: [ 
    { id: 1, desc: "Task 1" }, 
    { id: 2, desc: "Task 2" }, 
    ... 
    ] 
} 

Für das Update ($ http PUT) Anruf, Ich mag würde params: { deep: true } als Verknüpfung verwenden, um Code und $http Anrufe zu minimieren.

Das Problem im Moment ist, dass, während der PUT-Befehl das "Master" -Objekt in der Datenbank aktualisiert, die bearbeiteten "untergeordneten" Objekte nicht aktualisiert, sondern als neue untergeordnete Objekte angehängt werden.

Zum Beispiel, wenn ich versuche, die Master-und Kind-Objekte in einem Aufruf zu aktualisieren:

$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(....); 

die Datenbank nicht Update die untergeordneten Objekte, es fügt sie. Hier ist, wie das resultierende Objekt in der Datenbank:

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 
    ] 
} 

Ich habe dafür gesorgt, dass die untergeordneten Objekte id s richtig sind.

Gibt es eine Möglichkeit, dies prägnant zu tun oder bin ich damit einverstanden, es in mehreren Stufen zu tun? Funktioniert deep = true überhaupt mit PUT? Die Backand docs erwähnen es nicht.

Antwort

3

backand identifiziert bestehende Objekte entsprechend ihrer

{ 
    __metadata: {id: "6"} 
} 

Wenn Sie „GET“ ein Objekt aus backand es eine solche Metadaten enthält. Wenn Sie ein Objekt ohne die Metadaten-ID "PUT", wird Backand als neues Objekt bedroht. Verwenden Sie also entweder das gleiche tiefe Objekt, das Sie ursprünglich erhalten haben, oder fügen Sie die Metadaten-ID hinzu.

$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(....); 

Um Aufgaben Kinder in der "PUT" fordern Sie die params

params: { 
    deep: true, 
    overwrite: true 
} 
hinzufügen müssen löschen Überschreiben = true
Verwandte Themen