2016-04-08 15 views
1

Ben Angular uygulaması için veritabanı ve REST api sağlamak için Backand kullanıyorum.

Kullanıcıların daha sonra veritabanında güncelleştirilmesi gereken karmaşık bir nesneyi düzenlemeleri yapabilmeleri için çalışıyorum. Yeterince basit ...

nesne biraz şuna benzer:

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

güncelleme çağrısı, ben kod ve $http çağrıları en aza indirmek için kısayol olarak params: { deep: true } kullanmak istiyorum (http PUT $) için.

Şu anki sorun, PUT komutunun veritabanındaki "master" nesnesini güncelleştirmesidir, düzenlenmiş "child" nesneleri güncellenmez, ancak yeni alt nesneler olarak eklenir. Örneğin

, ben bir çağrıda ana ve alt nesneleri güncelleştirmeye çalışırsanız:

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

veritabanı değil güncelleştirme alt nesneler yapar, bu ekler. İşte ortaya çıkan nesne veritabanında nasıl açıklanmıştır: Ben çocuk nesnelerin id ler doğru olduğundan emin yaptık

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

.

Bunu kısa ve öz bir şekilde yapmanın bir yolu var mı, yoksa bunu birden çok aşamada yapmaya istekli miyim? deep = true, PUT ile çalışır mı? Backand docs bundan bahsetmiyor.

cevap

3

backand Eğer backand gelen bir nesne böyle bir meta verileri içeren "GET" Ne zaman onların

{ 
    __metadata: {id: "6"} 
} 

göre varolan nesneleri tanımlar. Meta veri kimliği olmayan bir nesneyi "PUT" yaptığınızda, Backand'ı yeni bir nesne olarak tehdit eder. Bu nedenle ya orijinal olarak aldığınız veya meta veri kimliğini eklediğiniz aynı derin nesneyi kullanın.

$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" in görevleri çocukları silmek için size params sadık = yazma eklemek zorunda talep

params: { 
    deep: true, 
    overwrite: true 
} 
İlgili konular