Я хочу динамически сгенерировать компонент для извлечения его HTML, вернуть его из функции и передать как [innerHTML] для поддержки текстов страниц с HTML -контентом.
Для этого Я написал сервис для генерации компонента, передачи параметров, обнаружения изменений и возврата его html:
public showText(notation: string, variables: object = {}) {
const cmpRef: ComponentRef<TextComponent> = this.textFactory.create(this.injector);
cmpRef.instance.isAdmin = this.isAdmin
cmpRef.instance.textNotation = notation;
cmpRef.instance.replaceVariables = variables;
cmpRef.hostView.detectChanges();
const textElement = (cmpRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;
return textElement.innerHTML;
}
Текстовый компонент HTML выглядит следующим образом:
<ng-container *ngIf="isAdmin">
<a [innerHTML]="textNotation | translate:replaceVariables"></a>
</ng-container>
<ng-container *ngIf="!isAdmin">
<div [innerHTML]="textNotation | translate:replaceVariables"></div>
</ng-container>
И чтобы вставить HTML, я вызываю функцию следующим образом:
<div [innerHTML]="ts.showTextbrick('text.key')"></div>
Теперь моя проблема:
Текст на самом деле отображается правильно. Но я получаю сообщение об ошибке, которое раздражает:
"Ошибка ОШИБКИ:" ExpressionChangedAfterItHasBeenCheckedError: Выражение изменилось после того, как оно было проверено "
Версия Angular 8.
Я попытался решить эту проблему следующим образом: вставив changeDetectorRef в TextComponent и вызвав его функцию detach () для нескольких хуков жизненного цикла, например: ngAfterViewInit, ngOnDestroy, ngOnInit
Вызов detach () - функция в cmpRef.hostView, вызов detach () - функция для cmpRef.changeDetectorRef.
В документации сказано - для локальных обнаружений изменений я буду вызывать .detectChanges () - Функция и .detach () впоследствии: https://angular.io/api/core/ChangeDetectorRef
я правильно понял? Есть идеи?