Jestem ciekawy, dlaczego rekord zawarty w zestawie wyników odpowiedzi Model.save()
nie zwraca prawidłowo zaktualizowanych powiązanych danych, mimo że zaktualizowane dane są zawarte na serwerze odpowiedź ...ExtJS 4.1 - Zwracanie skojarzonych danych w Model.Save() Odpowiedź
modelowym przykładem & Store Definicja:
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
});
aplikacja odpowiedź serwera proxy READ
życzenie z jednego modelu i związanej z nią danych. To wszystko działa hunky dory!
Odpowiedź serwera na żądanie odczytu
{
"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
}
dotąd wszystko działa zgodnie z planem ...
store = Ext.create("App.store.test.Simpson");
homer = store.getById(1);
kids = homer.getKids().getRange();
console.log("The Simpson Kids", kids); // [>constructor, >constructor, >constructor]
niepożądanego ZACHOWANIE ROZPOCZYNA SIĘ zapisać i UPDATE WNIOSKI
Oto moja odpowiedź testem dla UPDATE Zamówienie ...
/** 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!!
}
})
Zauważyłem, że jeśli będę sprawdzać rekord zwrócony przez serwer, generowanym Stowarzyszenia Store (tj getKidsStore
) Ograniczone zapisy są oryginalne rekordy, tj. nie mają "ZAPISANE" w ich nazwie. Właściwość kids
zwróconego rekordu rzeczywiście zawiera poprawne dane.
Jeśli dobrze rozumiem problem, jest to, że Ext.data.reader.Reader
nie aktualizuje poprawnie powiązany sklep z odpowiednimi danymi zawartymi w odpowiedzi .save()
. Jeśli tak, to moim zdaniem jest to bardzo nieintuicyjne, ponieważ oczekiwałbym takiego samego zachowania, jak czytnik, który obsługuje żądanie store.load()
i na początek zapełnia wygenerowane magazyny powiązań.
Czy ktoś może wskazać mi właściwy kierunek w osiąganiu pożądanego zachowania?
Nota prawna: To samo pytanie zostało zadane tutaj: ExtJs 4 - Load nested data on record save, ale bez odpowiedzi. Czuję moje pytanie będzie nieco bardziej dokładne ..
EDIT: Pisałem to pytanie nad na forach Sencha: http://www.sencha.com/forum/showthread.php?270336-Associated-Data-in-Model.save()-Response
EDIT (23.08.13): I re- napisałem ten post z kompletnym przykład, jak również dodatkowe wnioski ...
Dobre rozwiązanie! Z jakiegoś powodu odkryłem, że Store nie zawsze aktualizuje się przy ręcznym wywoływaniu operacji odczytu Proxy z Modelu ... Dlatego dodałem metodę "updateTo" w klasie Model, która obsługuje aktualizowanie instancji do dostarczonej rekord (pobrany z odpowiedzi serwera), w tym składnice stowarzyszeń. Ten sam pomysł, tylko inne podejście :) –
Dodałem metodę "updateTo" do mojej odpowiedzi, aby było bardziej zrozumiałe/pomocne. –