在启用自动同步的同步后存储执行某些操作

Posted

技术标签:

【中文标题】在启用自动同步的同步后存储执行某些操作【英文标题】:Store do something after sync with autoSync enabled 【发布时间】:2012-06-13 20:13:26 【问题描述】:

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

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

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

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

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

代码:

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

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

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

【问题讨论】:

【参考方案1】:

如果你问我,这是 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);
    ,

);

【讨论】:

我想你救了我,让我测试!!!疯狂的是他们在更新/添加/删除事件上有 REJECT,但从未被调用,我不明白他们为什么没有完成它。 你肯定救了我,我真的不明白他们为什么要做出这样的事情。【参考方案2】:

仅供参考:更新记录时的事件序列 (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() 方法将触发该事件。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于在启用自动同步的同步后存储执行某些操作的主要内容,如果未能解决你的问题,请参考以下文章

mysql开启主从同步后,主节点自动清理binlog时从节点会自动清理吗

Linux用ntpdate自动同步时间后使用crontab定时任务更新

Android:启用/禁用自动同步和后台数据

避免分析中的奇异性——OpenMDAO 是不是自动启用“完全同步”解决方案?

rsync+inotify 实现自动同步

Jenkins 自动打包后打一个tag并同步到origin