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