Cancel store.remove after server call in ExtJS 4

I'm using ExtJS 4 and have an Ext.data.Store with an ajax proxy and 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
                 });
             }
        }
    ...

When I use the update function and my server returns a json object with success:false (because he entered something wrong) the field in my associated grid is still marked as changed and the user has the option to change his wrong value.

That works fine.

But when I remove a record from the store...

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

...then ExtJS removes this record from the store first and call the ajax api afterwards. So when the destroy api returns success:false the message is shown as exception like in the update api, thats fine, but my record has been removed from the store! As example the exception from the server says that you cannot remove this record because of whatever but it's already removed in the store.

How to cancel the store removement after the server sync? I want the record to stay in the store if the server returns success:false .

Any idea? Maybe a bug?


UPDATE SOLUTION

Based on Ryan's anwer, I modified the exception listener as following, which works very well:

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

The insert technique didn't work for me, the removed record stays marked for removal on the next sync operation. I am using Ext.data.Store.rejectChanges() for this purpose.


我正在使用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/80018.html

上一篇: 用params加载商店

下一篇: 在ExtJS 4中调用服务器后取消store.remove