Model.save()
yanıt kümesindeki sonuçların, sunucuda bulunan güncel verilere rağmen neden güncelleştirilmiş ilişkili verileri düzgün bir şekilde geri göndermediğini merak ediyorum cevabı ...ExtJS 4.1 - Model.Save() Yanıtında İlişkilendirilen Veriler Yanıtı
Örnek Modeli & Mağaza Tanımı: tek model ile proxy READ
istek, ve ilişkili verilere
Ext.define("App.model.test.Parent",{
extend: 'Ext.data.Model',
requires: ['App.model.test.Child'],
fields: [
{name: 'id', type: 'int' },
{name: 'name', type: 'string'},
{name: 'kids', type: 'auto', defaultValue: []}
],
idProperty: 'id',
hasMany: [{
foreignKey: 'parent_id',
model: 'App.model.test.Child',
associationKey: 'kids',
name: 'getKids'
}],
proxy: {
type: 'ajax',
api : {
create: '/service/test/create/format/json',
read : '/service/test/read/format/json',
update : '/service/test/update/format/json'
},
reader: {
idProperty : 'id',
type : 'json',
root : 'data',
successProperty : 'success',
messageProperty : 'message'
},
writer: {
type : 'json',
writeAllFields : true
}
}
});
Ext.define("App.model.test.Child",{
extend: 'Ext.data.Model',
fields: [
{name: 'id', type: 'int' },
{name: 'name', type: 'string'},
{name: 'parent_id', type: 'int'}
]
});
Ext.define("App.store.test.Simpson",{
storeId: 'TheSimpsons',
extend: 'Ext.data.Store',
model : 'App.model.test.Parent',
autoLoad: true,
autoSync: false
});
uygulama sunucusu yanıt. Hepsi bu hunky dory!
Sunucu Yanıtı İsteği OKUYUN için
{
"data":{
"id":1,
"name":"Homer Simpson",
"children":{
"1":{
"id":1,
"name":"Bart Simpson"
},
"2":{
"id":2,
"name":"Lisa Simpson"
},
"3":{
"id":3,
"name":"Maggie Simpson"
}
}
},
"success":true,
"message":null
}
Bugüne kadar her şey ... plana göre çalışmaktadır
store = Ext.create("App.store.test.Simpson");
homer = store.getById(1);
kids = homer.getKids().getRange();
console.log("The Simpson Kids", kids); // [>constructor, >constructor, >constructor]
İSTENMEYEN DAVRANIŞ KAYDET İLE BAŞLIYOR VE GÜNCELLEME İSTEKLERİ
İşte
/** Server UPDATE Response */
{
"data":{
"id":1,
"name":"SAVED Homer Simpson",
"kids":[{
"id":1,
"name":"SAVED Bart Simpson",
"parent_id":1
},{
"id":2,
"name":"SAVED Lisa Simpson",
"parent_id":1
},{
"id":3,
"name":"SAVED Maggie Simpson",
"parent_id":1
}]
},
"success":true,
"message":null
}
/** Will call proxy UPDATE, response is above */
homer.save({
success: function(rec, op){
var savedRec = op.getRecords().pop(),
kidNames = '';
console.log(savedRec.get('name')); // SAVED Homer Simpson = CORRECT!
Ext.each(savedRec.getKids().getRange(), function(kid){
kidNames += kid.get('name') + ", ";
});
console.log(kids);
//Outputs: Bart Simpson, Lisa Simpson, Maggie Simpson = WRONG!!
}
})
Ben sunucu oluşturulan Derneği Store tarafından döndürülen kaydının incelenmesi (yani,
getKidsStore
) içerdiği kayıtları orijinal olduğunu fark ...
GÜNCELLEME İsteği benim test yanıttır kayıtlar, yani adında "KAYDEDİLMEDİ". Ancak, döndürülen kaydın
kids
özelliği, DOES gerçekten doğru verileri içerir.
Sorunu doğru bir şekilde anlarsam, Ext.data.reader.Reader
'un ilişkili deposu, .save()
yanıtında bulunan ilişkili verilerle doğru şekilde güncelleştirmemesidir. Eğer öyleyse, bence, bu, store.load()
isteğini işleyen okuyucuyla aynı davranışı bekleyeceğinden ve oluşturulacak ilişki depolarını doldurmaya başladığından çok kasıtsızdır.
Birisi, peşinde olduğum davranışa ulaşmada beni doğru yöne yönlendirebilir mi?
Sorumluluk Reddi: Aynı soru soruldu: ExtJs 4 - Load nested data on record save ama yanıt vermeden. Ben .. benim sorum biraz daha kapsamlı olmak nasıl bir duygu
DÜZENLEME: http://www.sencha.com/forum/showthread.php?270336-Associated-Data-in-Model.save()-Response
DÜZENLEME (8/23/13): Ben yeniden ben Sencha'sı forumlarında üzerinde bu soruyu gönderdiniz sorunu buldum, daha doğrusu karışıklıkExt.data.Operation
arasında getRecords()
yöntemi yatıyor bu bir TAM örnekle yazıyı yanı sıra ek bulgular ...
İyi bir çözüm! Herhangi bir nedenden dolayı, Mağazanın, Proxy'nin okuma işlemini Model'den manuel olarak başlatırken her zaman güncellenmediğini fark ettim ... Bu nedenle, model sınıfını, sağlanan bir örneğe güncelleştirmeyi sağlayan Model sınıfında 'updateTo' ekledim İlişkilendirme mağazaları dahil olmak üzere kayıt (sunucunun yanıtından alındı). Aynı fikir, sadece farklı yaklaşım :) –
Daha açık/yardımcı olmak için 'updateTo' yöntemini yanıtıma ekledim. –