如何添加同步回调以存储在 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 中的主要内容,如果未能解决你的问题,请参考以下文章