Я создаю Angular код во время выполнения, в частности, я использую библиотеку SVG для создания векторной графики c, которая содержит Angular кодовых директив, таких как (click)='myMethod()'
, которые, в свою очередь, вызывают методы, которые я статически определил в SVG-компоненте. Будучи сгенерированным во время выполнения, мне нужно скомпилировать созданный шаблон и добавить его в компонент. Я реализовал такой код тогда с помощью Angular 3 с помощью этого поста , что было довольно громоздко. Я попытался скопировать старый код в приложении Angular 8:
private addComponent(template: string) {
@Component({template: template + ' <div #target></div>'})
class TemplateComponent {
@ViewChild('target', {static: false, read: ViewContainerRef}) public target;
constructor() {
}
public myMethod() {
// do something
}
}
@NgModule({declarations: [TemplateComponent]})
class TemplateModule {
@ViewChild('target', {static: false, read: ViewContainerRef}) public target;
}
// ERROR in next line:
const mod = this.compiler.compileModuleAndAllComponentsSync(TemplateModule);
const factory = mod.componentFactories.find((comp) =>
comp.componentType === TemplateComponent
);
this.container.createComponent(factory);
}
, которое теперь не работает с
Ошибка: ошибка: компилятор времени выполнения не загружен в Compiler._throwError (core. js: 38932)
С одной стороны, я понятия не имею, почему возникает эта ошибка. Все, что я нашел в inte rnet, было о критическом синтаксисе функции при отложенной загрузке модуля. С другой стороны, интересно, если пять Angular основных версий позже, есть другой способ сделать это. Я читал о Portals , но, похоже, речь идет о динамической загрузке шаблонов stati c, а не нескомпилированных шаблонов, сгенерированных на лету. С нетерпением жду, когда кто-нибудь направит меня в правильном направлении.