我通过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();