存储在启用autoSync同步后执行某些操作

时间:2012-06-13 20:13:27

标签: extjs extjs4.1

我正在尝试检测并删除同步后仍在商店但未添加到数据库中的字段(成功:false)。然后,向用户返回一条错误消息(带有一些错误代码)。但是我只能在商店文档中看到“beforesync”事件。

有没有可能做这样的事情?我正在尝试“更新”事件,但只有在同步成功时才会在同步后调用它们(否则它们仅在同步之前被调用)。

我无法找到同步后触发的事件。 对此有何解决方案?

请注意,我正在使用autoSync,这就是为什么我无法挂钩回调,否则一切都会变得更容易。

我在文档中看到的另一个重点是:

代码:

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

为什么REJECT事件永远不会被解雇?我认为如果成功=假REJECT将被调用,我是否需要类似404的东西来获得该结果?

编辑:不,我找不到解雇更新事件的REJECT版本的方法。有什么建议吗?

3 个答案:

答案 0 :(得分:13)

如果你问我,ExtJS中存​​在一些设计缺陷。

AbstractStore有onCreateRecordsonUpdateRecordsonDestroyRecords,它们是您可以覆盖的空函数。如果成功为假,你可以调用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)

解决此问题的另一种方法是使用商店的suspendAutoSyncresumeAutoSync方法,然后手动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();