Store делать что-то после синхронизации с включенной автосинхронизацией

Я пытаюсь обнаружить и удалить те поля, которые после синхронизации все еще находятся в хранилище, но не добавляются в базу данных (успех: ложь). Затем верните сообщение об ошибке пользователю (с некоторыми кодами ошибок). Однако я могу видеть только событие beforesync в документации магазина.

Есть ли возможность сделать такую ​​вещь? Я пытаюсь с "обновить" события, но они вызываются после синхронизации, только если синхронизация прошла успешно (в противном случае они вызываются только до синхронизации).

Я не могу найти событие, которое запускается после синхронизации. Любое решение для этого?

Обратите внимание, что я использую автосинхронизацию, поэтому я не могу подключиться к обратному вызову, иначе все будет проще.

Другой важный момент, который я вижу в документации:

Код:

Ext.data.Model.EDIT
Ext.data.Model.REJECT
Ext.data.Model.COMMIT

Почему событие REJECT никогда не запускается? Я думал, что, если success = false REJECT будет вызван, мне нужно что-то вроде 404, чтобы получить этот результат?

РЕДАКТИРОВАТЬ: Нет, я не могу найти способ запустить REJECT версию события обновления. Любое предложение?

3 ответа

Решение

Это, если вы спросите меня, некоторый недостаток дизайна в ExtJS.

AbstractStore имеет onCreateRecords, onUpdateRecords, а также onDestroyRecords, которые являются пустыми функциями, которые вы можете переопределить. Вы можете вызвать rejectChanges(), если в этом случае успех равен false.

Ext.define('BS.store.Users', {
    extend: 'Ext.data.Store',    
    model: 'BS.model.User',

    autoSync: true,
    autoLoad: true,

    proxy: {
        type: 'direct',
        api: {
            create: Users.Create,
            read: Users.Get,
            update: Users.Update,
            destroy: Users.Delete,

        },
        reader: {
            type: 'json',
            root: 'data',
        },
    },

    onCreateRecords: function(records, operation, success) {
        console.log(records);
    },

    onUpdateRecords: function(records, operation, success) {
        console.log(records);
    },

    onDestroyRecords: function(records, operation, success) {
        console.log(records);
    },

});

К вашему сведению: последовательность событий при обновлении записи (ExtJs 5.0.1)

Scenerio 1
javascript executes 
record.set('some data')  // Store has autoSync: true, The database will succeed

'update' event fires (operation = 'edit')
'beforesync' event fires
network traffic occurs database returns a success (json)
'update' event fires (operation = 'commit') 
'onUpdateRecord' method runs

Scenerio 2
javascript executes
record.set('some data')  // Store has autoSync: true, The database will fail

'update' event fires (operation = 'edit')
'beforesync' event fires
network traffic occurs database returns a failure (json)
'onUpdateRecord' method runs and calls rejectChanges()
'update' event fires (operation = 'reject') 
'exception' event fires

Два примечания: а) последнее обновление и onUpdateRecord меняются местами и б) если onUpdateRecord не вызывает rejectChanges(), следующее событие обновления не вызывается. Это оставит запись в грязном состоянии, что означает, что последующая синхронизация () отправит ее.

Для record.add() события аналогичны, но я вижу, что событие add не вызывается. В документации Ext для события говорится, что оно запускается, но в той же документации не говорится, что метод add () вызовет событие.

Еще один способ обойти это использовать suspendAutoSync а также resumeAutoSync методы магазина, а затем вручную sync (Ext JS > 4.1.0):

store.suspendAutoSync();
store.insert(0, record);
store.sync({
   success: function (batch, options) {
      // do something
   },
   failure: function (batch, options){
      // handle error
   }
});
store.resumeAutoSync();
Другие вопросы по тегам