sencha extjs store hasmany迭代速度很慢

时间:2019-01-31 21:33:26

标签: extjs store

我有一个严重的性能问题,即通过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外没有其他信息,但实际上它们没有以任何方式连接到商店。

是否有一些更快的方法可以使与团队相关的球员真正地做某事?

1 个答案:

答案 0 :(得分: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();