sto usando ExtJS 4 e hanno un Ext.data.Store con un proxy Ajax e api:Annulla store.remove dopo la chiamata del server in ExtJS 4
var gridStore = Ext.create('Ext.data.Store', {
autoSync: true,
proxy: {
type: 'ajax',
api: {
read: 'myurl',
create: 'myurl',
update: 'myurl',
destroy: 'myurl'
},
reader: {
type: 'json',
successProperty: 'success',
root: 'data',
messageProperty: 'message'
},
writer: {
type: 'json',
writeAllFields: false,
root: 'data'
},
listeners: {
exception: function(proxy, response, operation){
Ext.MessageBox.show({
title: 'Server error',
msg: operation.getError(),
icon: Ext.MessageBox.ERROR,
buttons: Ext.Msg.OK
});
}
}
...
Quando uso la funzione di aggiornamento e il mio server restituisce un oggetto json con success:false
(perché ha inserito qualcosa di sbagliato) il campo nella mia griglia associata è ancora contrassegnato come modificato e l'utente ha la possibilità di cambiare il suo valore errato.
Ciò funziona correttamente.
Ma quando ho rimuovere un record dal negozio ...
var store = Ext.StoreManager.lookup('gridStore');
store.remove(store.getById(id));
... poi ExtJS rimuove questo record dal negozio prima e chiamare l'API Ajax dopo. Quindi, quando la destroy api restituisce success:false
, il messaggio viene visualizzato come eccezione come nell'API di aggiornamento, ma va bene, ma il mio record è stato rimosso dallo store! Ad esempio l'eccezione del server dice che non è possibile rimuovere questo record a causa di qualsiasi cosa ma è già stato rimosso nell'archivio.
Come annullare la rimozione del negozio dopo la sincronizzazione del server? Voglio che il record rimanga nel negozio se il server restituisce success:false
.
Qualche idea? Forse un bug?
UPDATE SOLUZIONE
Sulla base di Anwer di Ryan, ho modificato l'ascoltatore eccezione, come segue, che funziona molto bene:
listeners: {
exception: function(proxy, response, operation){
Ext.MessageBox.show(...);
// get the removed records and insert them where they have been
var removedRecords = gridStore.getRemovedRecords();
for(var i=0; i<removedRecords.length; i++){
var record = removedRecords[i];
gridStore.insert(record.index, record);
}
}
}
Probabilmente un bug, o necessità di scavare nel codice sorgente per vedere cosa succede. Hmm. Domanda interessante Ho visto questo prima, ma ho superato questo ricaricando il negozio. Inefficiente, ma va bene per i dati di piccole dimensioni. –
Bello :) Ma hai dimenticato di aggiungere 'gridStore.removed = []' else se rimuovi l'elemento avrai duplicati (quindi è ancora nell'array rimosso) – VDP