sencha-extjs存储有许多迭代是缓慢的



我在通过hasMany关系更新记录时遇到了严重的性能问题。(使用sencha extjs 4.0)

假设我们有一个具有hasMany关系的模型。我将在一个基于运动队和他们的球员的简化模型中重写我的实际内容。

Ext.define('project.model.Team', {
extend: 'Ext.data.Model'
, fields: [
{name: 'id', type: 'int'}
, {name: 'name', type: 'string'}
]
, hasMany: [
{ model: 'project.model.Player', name: 'players' }
]
});
Ext.define('project.model.Player', {
extend: 'Ext.data.Model'
, fields: [
{name: 'id', type: 'int'}
, {name: 'team_id', type: 'int'}
, {name: 'name', type: 'string'}
, {name: 'attribute', type: 'int'}
]
, associations: [
{ type: 'belongsTo', model: 'project.model.Team', foreignKey: 'team_id', primaryKey: 'id' }
]
});

假设有很多球队和很多球员,但我们想更新特定球队中每个球员的信息。也许球队打了一场比赛,所以我们加了一场。细节并不重要。

这是工作代码。这不是一个问题,直到有人在一个已经相当大的数据库中建立了一个有很多"球员"的"团队"。这个循环在一个相当适中的大小下需要很长时间。我认为set在每次迭代中都会触发额外的检查,而不仅仅是setDirty。

teamStore.getById(record.get('item_id')).players().each(function(player) {
var player_instance = exceptionStore.getById(exception.get('id'));
player_instance.set('attribute', value);
});
playerStore.sync();

这运行得非常快,在引用对象上设置属性,并且什么都不做。

teamStore.getById(record.get('item_id')).players().each(function(player) {
player.set('attribute', value);
});
teamStore.sync();
playerStore.sync();

我认为这个代码不起作用,因为玩家只是某种参考,除了玩家商店中的id之外没有其他信息,但他们实际上并没有以任何方式连接到商店。

有没有更快的方法让球员与球队联系起来,并真正有所作为?

您需要使用suspendEvents将存储置于批量更新模式,这样它就可以将所有更改排队,而不是在循环过程中尝试一次一个地进行所有内部记账。一旦你完成了对它的更改,让它在resumeEvents中跟上。

https://docs.sencha.com/extjs/4.0.7/#/api/Ext.data.Store-method-suspendEvents

playerStore.suspendEvents();
playerStore.query('team_id', team_id).each(function(player){
player.set('attribute', value);
});
playerStore.resumeEvents();
playerStore.sync();

最新更新