Я использую ExtJS 4 и у меня есть Ext.data.Store с ajax-прокси и api:
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
});
}
}
...
Когда я использую функцию обновления и мой сервер возвращает объект json с success:false
(потому что он ввел что-то не так), поле в моей связанной сетке все еще помечено как измененное, и у пользователя есть возможность изменить его неправильное значение.
Это прекрасно работает.
Но когда я удаляюзапись из хранилища ...
var store = Ext.StoreManager.lookup('gridStore');
store.remove(store.getById(id));
... затем ExtJS сначала удаляет эту запись из хранилища, а затем вызывает ajax api.Таким образом, когда API уничтожения возвращает success:false
, сообщение отображается как исключение, как в API обновления, это нормально, но моя запись была удалена из хранилища!Например, исключение из сервера говорит, что вы не можете удалить эту запись из-за чего-либо, но она уже удалена в хранилище.
Как отменить удаление хранилища после синхронизации сервера?Я хочу, чтобы запись оставалась в хранилище, если сервер вернет success:false
.
Есть идеи?Может быть, ошибка?
ОБНОВЛЕНИЕ РЕШЕНИЕ
Исходя из ответа Райана, я изменил прослушиватель исключений следующим образом, который работает очень хорошо:
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);
}
}
}