Sono curioso di sapere perché il record contenuto nel set di risultati di una risposta Model.save()
non restituisce correttamente i dati associati aggiornati, nonostante i dati aggiornati siano contenuti nel server risposta ...ExtJS 4.1 - Restituzione dei dati associati nella risposta Model.Save()
Esempio modello & Conservare Definizione: risposta del server
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
});
la domanda di READ
richiesta del proxy con un unico modello, e la sua dati associati. Tutto questo funziona hunky dory!
Risposta del server di richiesta di lettura
{
"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
}
Finora, tutto funziona secondo i piani ...
store = Ext.create("App.store.test.Simpson");
homer = store.getById(1);
kids = homer.getKids().getRange();
console.log("The Simpson Kids", kids); // [>constructor, >constructor, >constructor]
IL comportamento indesiderato INIZIA CON salvare e aggiornare RICHIESTE
Ecco la mia risposta di prova per la UPDATE Richiesta ...
/** 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!!
}
})
mi accorgo che se io esaminare il record restituito dal server, l'Associazione generato Store (vale a dire, getKidsStore
) i record contenuti sono l'originale record, cioè, non hanno "SALVATO" nel loro nome. La proprietà kids
del record restituito, tuttavia, contiene effettivamente i dati corretti.
Se ho compreso correttamente il problema, è che lo Ext.data.reader.Reader
non aggiorna correttamente l'archivio associato con i dati associati contenuti nella risposta .save()
. In tal caso, a mio parere, questo è molto intuitivo in quanto mi aspetterei lo stesso comportamento del lettore che gestisce la richiesta store.load()
e popola gli archivi di associazione generati per iniziare.
Qualcuno può indicarmi la giusta direzione per ottenere il comportamento che sto cercando?
Disclaimer: La stessa domanda è stata posta qui: ExtJs 4 - Load nested data on record save ma senza risposta. Sento la mia domanda per essere un po 'più approfondita ..
EDIT: Ho postato questa domanda più sul forum di Sencha: http://www.sencha.com/forum/showthread.php?270336-Associated-Data-in-Model.save()-Response
EDIT (8/23/13): I Re- ha scritto questo post con un esempio completo, così come i risultati supplementari ...
Buona soluzione! Per qualche motivo, ho riscontrato che lo Store non si aggiorna sempre quando si richiama manualmente l'operazione di lettura del Proxy dal Modello ... Quindi ho aggiunto un metodo 'updateTo' sulla classe Model, che gestisce l'aggiornamento di un'istanza al fornito record (recuperato dalla risposta del server), inclusi i negozi di associazioni. Stessa idea, solo approccio diverso :) –
Aggiunto il metodo 'updateTo' alla mia risposta per essere più chiaro/utile. –