4

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

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

我真的找不到同步后触发的事件。有什么解决办法吗?

请注意,我正在使用自动同步,这就是为什么我不能挂钩回调,否则一切都会更容易。

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

代码:

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

为什么 REJECT 事件永远不会被触发?我认为如果成功 = false REJECT 会被调用,我是否需要类似 404 的东西才能获得该结果?

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

4

3 回答 3

13

如果你问我,这是 ExtJS 中的一些设计缺陷。

AbstractStore 有onCreateRecords,onUpdateRecordsonDestroyRecords, 是可以覆盖的空函数。如果成功为假,您可以调用 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);
    },

});
于 2012-06-13T23:49:30.587 回答
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(),则不会触发以下 'update' 事件。这将使记录处于脏状态,这意味着后续的 sync() 将发送它。

对于 record.add() 事件是相似的,但是我看到 'add' 事件没有被触发。该事件的 Ext 文档说它被触发,但相同的文档没有说 add() 方法将触发该事件。

于 2015-04-08T11:14:42.990 回答
2

解决这个问题的另一种方法是使用storesuspendAutoSyncresumeAutoSync方法,然后手动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();
于 2015-09-04T06:11:50.050 回答