Używam ExtJS 4 i mają Ext.data.Store z ajax pełnomocnika i API:Anuluj store.remove po wywołaniu serwera w 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
});
}
}
...
Kiedy korzystać z funkcji aktualizacji i mój serwer zwraca obiekt json z success:false
(ponieważ wprowadził coś nieprawidłowego) pole w mojej powiązanej siatce jest nadal oznaczone jako zmienione, a użytkownik ma możliwość zmiany swojej niewłaściwej wartości.
To działa dobrze.
Ale kiedy wyjąć płytę ze sklepu ...
var store = Ext.StoreManager.lookup('gridStore');
store.remove(store.getById(id));
... ExtJS następnie usuwa tę płytę ze sklepu pierwszy i wywołać ajax api później. Więc kiedy niszczy api zwróci success:false
, wiadomość zostanie pokazana jako wyjątek, jak w api aktualizacji, to w porządku, ale mój rekord został usunięty ze sklepu! Przykład: wyjątek od serwera mówi, że nie można usunąć tego rekordu z powodu czegokolwiek, ale został już usunięty ze sklepu.
Jak anulować usuwanie sklepu po synchronizacji serwera? Chcę, aby rekord pozostał w sklepie, jeśli serwer zwróci success:false
.
Każdy pomysł? Może błąd?
UPDATE ROZWIĄZANIE
podstawie anwer Ryana, I zmodyfikowane słuchacza wyjątek jako następujące, które działa bardzo dobrze:
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);
}
}
}
Prawdopodobnie błąd lub potrzeba zagłębienia się w kod źródłowy, aby zobaczyć, co się stanie. Hmm. Interesujące pytanie. Widziałem to już wcześniej, ale pokonałem to przez ponowne załadowanie sklepu. Nieefektywne, ale w przypadku małych danych jest w porządku. –
Przyjemnie :) Ale zapomniałeś dodać 'gridStore.removed = []' else jeśli usuniesz ten element ponownie, będziesz miał duplikaty (wtedy nadal jest w usuniętej tablicy) – VDP