Отмена store.remove после вызова сервера в ExtJS 4 - PullRequest
9 голосов
/ 24 октября 2011

Я использую 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);
         }
     }
 }

Ответы [ 4 ]

6 голосов
/ 11 августа 2012

Метод вставки у меня не сработал, удаленная запись остается помеченной для удаления при следующей операции синхронизации.Я использую Ext.data.Store.rejectChanges() для этой цели.

5 голосов
/ 24 октября 2011

Просто расширяем код, который вы дали, в частности область 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());
         }
    }
2 голосов
/ 14 мая 2013

Я использую функции обратного вызова «успех», «сбой» или «обратный вызов» при синхронизации.Я надеюсь, что этот метод может помочь вам.

store.remove(records);
store.sync({ 
    success: function (proxy, operations) {
        // pop success message
    }, failure: function (proxy, operations) {
        // resume records
        store.rejectChanges();
    }
});
2 голосов
/ 05 апреля 2012

Я использую 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.');
                            },

                        });
                    }
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...