sencha extjs store hasmany迭代很慢

问题描述 投票:1回答:1

我通过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之外没有任何信息,但他们实际上并没有以任何方式连接到商店。

有没有更快的方法让球员与球队联系,并实际做点什么?

extjs store
1个回答
0
投票

您需要使用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();
© www.soinside.com 2019 - 2024. All rights reserved.