Мой сценарий проблемы следующий:
У меня есть страница с большой формой (+100 входов). Эти входные данные разделены на разделы, и эти разделы разрабатываются как различные компоненты (для повторного использования). Таким образом, общий макет страницы выглядит примерно так:
<div>
<form-section-a></form-section-a>
<form-section-b></form-section-b>
<form-section-c></form-section-c>
...
<form-section-z></form-section-z>
</div>
Обработка каждого раздела формы займет некоторое время, поскольку большинство входных данных представляют собой поля выбора материала, и необходимые данные необходимо загрузить из REST API и обработать.
В показанном выше макете angular попытается отобразить все разделы формы одновременно, что приводит к увеличению времени обработки каждого раздела, что приводит к зависанию браузера.
Итак, мой план - загружать разделы один за другим. Есть ли какой-нибудь рекомендуемый способ достижения этого?
Я попытался написать структурную директиву для загрузки компонентов один за другим. Несмотря на то, что директива работает, я не могу узнать, когда компонент завершил свою внутреннюю обработку (возможно, ловушка AfterViewInit). Директива выглядит примерно так:
<div tcSequentialRenderer>
<form-section-a *tcIfPreviousBlockLoaded></form-section-a>
<form-section-b *tcIfPreviousBlockLoaded></form-section-b>
<form-section-c *tcIfPreviousBlockLoaded></form-section-c>
...
<form-section-z *tcIfPreviousBlockLoaded></form-section-z>
</div>
.
@Directive({selector: '[tcSequentialRenderer]'})
export class SequentialRendererDirective implements AfterViewInit {
@ContentChildren(IfPreviousBlockLoadedDirective) directives: QueryList<IfPreviousBlockLoadedDirective>;
ngAfterViewInit() {
// start from first item
if (this.directives.length > 0) {
this.directives.toArray()[0].show();
}
let directivesArray = this.directives.toArray();
for (let i = 1; i < directivesArray.length; i++) {
directivesArray[i - 1].done.subscribe(status => {
if (status) {
directivesArray[i].show();
}
});
}
}
}
.
@Directive({selector: '[tcIfPreviousBlockLoaded]'})
export class IfPreviousBlockLoadedDirective {
private isShown = false;
public done: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
constructor(
private tplref: TemplateRef<any>,
private vcref: ViewContainerRef
) { }
public show(): void {
if (!this.isShown) {
this.vcref.createEmbeddedView(this.tplref);
this.isShown = true;
}
}
}
Если я смогу каким-либо образом получить доступ к связанному компоненту из IfPreviousBlockLoadedDirective
, этот метод будет работать без проблем.
Есть ли какие-либо предложения, чтобы это исправить, или есть ли другие способы добиться этого без изменения компонентов раздела формы?
ПРИМЕЧАНИЕ. Сечение формы может быть любым угловым компонентом.