2016-04-08 1 views
1

Я использую Backand для предоставления базы данных и 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 s является правильным.

Есть ли способ сделать это лаконично, или я ушел в отставку, чтобы сделать это на нескольких этапах? Делает deep = true даже работать с PUT? Backand docs не упоминает об этом.

ответ

3

Backand идентифицирует существующие объекты в соответствии с их

{ 
    __metadata: {id: "6"} 
} 

Когда вы «GET» объект из Backand содержит такие метаданные. Когда вы «PUT» объект без идентификатора метаданных, Backand угрожает ему как новому объекту. Итак, либо используйте тот же самый глубокий объект, который вы изначально получили, либо добавили идентификатор метаданных.

$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» просить, вы должны добавить перезапись = верны Params

params: { 
    deep: true, 
    overwrite: true 
} 
Смежные вопросы