У нас есть 2 списка: короткий и большой.Большой загружает дату на основе выбора в коротком.
В этом примере большинство элементов в большом списке изначально выбрано (380 из 400).После того, как новый выбор сделан в коротком списке, данные в большом списке должны быть очищены и загружены снова.
Теперь разница заключается в строке
// await this.delayExecution(1);
в родительском компоненте.Uncommenting await (даже с 1 мс) изменяет поток выполнения таким образом, что второй список реагирует немедленно.
Транспортируемый код JavaScript:
ParentComponent.prototype.selectionChanged = function (data) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
console.log('waiting');
this.dataSelectedLarge = [];
// await this.delayExecution(1);
this.dataToSetLarge = [];
console.log('changed');
return [2 /*return*/];
});
});
};
И без комментариев:
ParentComponent.prototype.selectionChanged = function (data) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log('waiting');
this.dataSelectedLarge = [];
return [4 /*yield*/, this.delayExecution(1)];
case 1:
_a.sent();
this.dataToSetLarge = [];
console.log('changed');
return [2 /*return*/];
}
});
});
};
Итак, очистка выделения
this.dataSelectedLarge = [];
и данных
this.dataToSetLarge = [];
без какой-либо задержки вызывает новый рендеринг списка, который занимает много времени, тогда как рендеринг с ожиданием происходит мгновенно.
Пример приведен здесь: Angular 2 Performance Select
Вопросы:
- почему вызывает такое поведение
- что было бы правильной реализацией
В реальном приложении мы используем ChangeDetectionStrategy.OnPush в дочернем компоненте.