我正在尝试检测并删除同步后仍在商店但未添加到数据库中的字段(成功:false)。然后,向用户返回一条错误消息(带有一些错误代码)。但是我只能在商店文档中看到“beforesync”事件。
有没有可能做这样的事情?我正在尝试“更新”事件,但只有在同步成功时才会在同步后调用它们(否则它们仅在同步之前被调用)。
我无法找到同步后触发的事件。 对此有何解决方案?
请注意,我正在使用autoSync,这就是为什么我无法挂钩回调,否则一切都会变得更容易。
我在文档中看到的另一个重点是:
代码:
Ext.data.Model.EDIT
Ext.data.Model.REJECT
Ext.data.Model.COMMIT
为什么REJECT事件永远不会被解雇?我认为如果成功=假REJECT将被调用,我是否需要类似404的东西来获得该结果?
编辑:不,我找不到解雇更新事件的REJECT版本的方法。有什么建议吗?
答案 0 :(得分:13)
如果你问我,ExtJS中存在一些设计缺陷。
AbstractStore有onCreateRecords
,onUpdateRecords
和onDestroyRecords
,它们是您可以覆盖的空函数。如果成功为假,你可以调用rejectChanges()。
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);
},
});
答案 1 :(得分:4)
仅供参考:更新记录时的事件顺序(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
两个注释:a)最后一次更新和onUpdateRecord是相反的 b)如果onUpdateRecord没有调用rejectChanges(),则更新'事件未被解雇。这将使记录处于脏状态,这意味着后续的sync()将发送它。
对于record.add()事件是相似的,但我看到'添加'事件未被解雇。该事件的Ext文档说它被触发但是相同的文档没有说add()方法将触发事件。
答案 2 :(得分:2)
解决此问题的另一种方法是使用商店的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();