如何添加同步回调以存储在 ExtJS 中

Posted

技术标签:

【中文标题】如何添加同步回调以存储在 ExtJS 中【英文标题】:How to add sync callbacks to store in ExtJS 【发布时间】:2020-05-13 12:11:52 【问题描述】:

我有一个商店,我想在每次完成某些操作时手动同步它。

我也见过this question 和this one。

我想知道是否有办法在商店配置上建立默认同步回调函数。

我知道我可以这样做:

store.sync(
        success: function(batch, options) 
            console.log('ok');
        ,
        failure: function(batch, options) 
            console.log('not ok');
        
    );

但我想在商店本身中定义一次回调,然后我只需调用 store.sync();

这是我正在合作的商店的示例:

Ext.define('MyApp.store.MyStore', 
    extend: 'Ext.data.Store',
    alias: 'store.MyStore',
    model: 'MyApp.model.MyModel',
    autoLoad: true,
    proxy: 
        type: 'rest',
        url: '../../api/myEndPoint',
        noCache: false,
        reader: 
            type: 'json',
            rootProperty: 'data',
            successProperty: 'success',
            totalProperty: 'total'
        ,
        actionMethods: 
            read: 'GET',
            destroy: 'DELETE'
        ,
        extraParams: 
            type: 'aux'
        
    ,
);

【问题讨论】:

【参考方案1】:

如果有办法通过框架的方式实现你想要的,我找不到它。

总有另一种选择,您可以将同步包装到一个函数中,并在每次要与这些特定回调同步时调用该函数:

function sync(
    success = (batch, options) => console.log('ok'),
    failure = (batch, options) => console.log('not ok')
 = ) 
    store.sync(success, failure);


可以通过传入参数来改变参数中的默认函数:

// default paramters will be used
sync();

// just one parameter
sync(
  failure: () => 
    console.log('new failure handler');
  
);

// both parameters
sync(
  success: () => 
    console.log('new success handler');
  ,
  failure: () => 
    console.log('new failure handler');
  
);

请考虑,如果商店的默认回调将被实施,此解决方案可能会被视为“黑客”。使用框架自己的解决方案将是一个更好的主意。

【讨论】:

【参考方案2】:

我会通过覆盖商店的 sync 方法来解决这个问题。

Sync 基本上是调用代理的 batch 方法,支持成功和失败回调。因此,如果您在商店中设置了例如 syncSuccess 和 syncFailure 回调,它们只会在同步商店后被调用。

注意事项:

我在 7.1.0 版本上测试了该解决方案。检查您的版本的同步方法是否存在差异 您需要为商店中未定义回调的情况添加额外的逻辑
Ext.define('Overrides.data.Store', 
    override: 'Ext.data.Store',

    sync: function(options) 
        var me = this,
            operations = ,
            toCreate = me.getNewRecords(),
            toUpdate = me.getUpdatedRecords(),
            toDestroy = me.getRemovedRecords(),
            needsSync = false;

        //<debug>
        if (me.isSyncing) 
            Ext.log.warn('Sync called while a sync operation is in progress. ' +
                         'Consider configuring autoSync as false.');
        
        //</debug>

        me.needsSync = false;

        if (toCreate.length > 0) 
            operations.create = toCreate;
            needsSync = true;
        

        if (toUpdate.length > 0) 
            operations.update = toUpdate;
            needsSync = true;
        

        if (toDestroy.length > 0) 
            operations.destroy = toDestroy;
            needsSync = true;
        

        if (needsSync && me.fireEvent('beforesync', operations) !== false) 
            me.isSyncing = true;

            options = options || ;

            me.proxy.batch(Ext.apply(options, 
                operations: operations,
                listeners: me.getBatchListeners(),
                $destroyOwner: me,
                success: me.syncSuccess,
                failure: me.syncFailure
            ));
        

        return me;
    
);

【讨论】:

以上是关于如何添加同步回调以存储在 ExtJS 中的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS - 使用同步时发送自定义标头

extjs 5 商店同步绑定到选择 hasMany

如何告诉 ExtJS Grid 编辑过的数据已经同步?

ExtJS 6在store sync的回调中访问messageProperty

Extjs4,包含MS dateFormat 同步的存储?

ExtJS - 与重复 ID 同步