sencha extjs store hasmany итерация медленная - PullRequest
0 голосов
/ 01 февраля 2019

У меня серьезная проблема с производительностью при обновлении записей через отношение 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();

Я думаю, что код не работает, потому что игроки - это просто какая-то ссылка, в которой нет информации, кроме их идентификатора в магазине игроков, но на самом деле они никак не связаны с магазином.

Естьесть ли какой-нибудь более быстрый способ связать игроков с командой и что-нибудь сделать?

1 Ответ

0 голосов
/ 17 февраля 2019

Вам нужно перевести хранилище в режим пакетного обновления с помощью suspendEvents, чтобы оно помещало в очередь все изменения, а не пыталось выполнять всю внутреннюю бухгалтерию по одному во время цикла.Как только вы закончите изменять его, дайте ему наверстать в резюме.

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();
...