在ExtJS 4中调用服务器后取消store.remove

我正在使用ExtJS 4,并且有一个带有ajax代理和api的Ext.data.Store:

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
                 });
             }
        }
    ...

当我使用更新函数并且我的服务器返回success:false的json对象时success:false (因为他输入了错误),我的关联网格中的字段仍然标记为已更改,用户可以选择更改其错误值。

这工作正常。

但是当我从商店里删除一条记录时......

var store = Ext.StoreManager.lookup('gridStore');
store.remove(store.getById(id));

...然后ExtJS首先从商店中删除此记录,然后再调用ajax api。 所以,当销毁api返回success:false消息显示为异常像更新API中,这很好,但我的记录已被删除从商店! 例如,来自服务器的例外情况表示,无论如何,您都无法删除此记录,但它已在商店中删除。

如何在服务器同步后取消商店删除? 如果服务器返回success:false我希望记录留在商店中success:false

任何想法? 也许是一个错误?


更新解决方案

基于Ryan的anwer,我修改了异常监听器,如下所示,这非常有效:

 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);
         }
     }
 }

只是扩展你给出的代码,特别是listeners区域:

    listeners: {
         exception: function(proxy, response, operation){
             Ext.MessageBox.show({
                 title: 'Server error',
                 msg: operation.getError(),
                 icon: Ext.MessageBox.ERROR,
                 buttons: Ext.Msg.OK
             });
             gridStore.add(gridStore.getRemovedRecords());
         }
    }

插入技术不适用于我,删除的记录保留标记为在下一次同步操作中删除。 为此,我正在使用Ext.data.Store.rejectChanges()


我正在使用model.destroy,这是我用来删除网格中的单数条目:

                text : 'Delete',
                itemId : 'delete',
                scope : this,
                handler : function() {
                    var selection = grid.getView().getSelectionModel().getSelection()[0];
                    if(selection) {
                        selection.destroy({
                            failure : function() {
                                console.log('Record could not be deleted.');
                            },
                            success : function() {
                                store.remove(selection);
                                console.log('Record successfuly removed.');
                            },

                        });
                    }
                }
链接地址: http://www.djcxy.com/p/80017.html

上一篇: Cancel store.remove after server call in ExtJS 4

下一篇: Extjs. Can't catch write event after store.save() with create action