Создание углового динамического компонента НЕ работает при ПРОИЗВОДСТВЕ
У меня проблема с динамическим рендерингом компонента с помощьюViewContainerRef в элементе гридстера.
Я реализовал компонент, который принимает ссылку на компонент, входы и выходы в качестве входных данных и создает данный компонент внутри себя.
например: <app-component-loader [compRef]="{ref: ExComponent}"><app-component-loader>
внутри компонента загрузчик по обратному вызову InInit у меня есть
if (this.compRef && this.compRef.ref) {
this._componentFactory = this._componentFactoryResolver.resolveComponentFactory(this.compRef.ref);
const instance = this.viewContainer.createComponent(this._componentFactory, 0).instance;
console.log(instance);
if (this.compInputs) {
Object.getOwnPropertyNames(this.compInputs).forEach(field => {
instance[field] = this.compInputs[field];
});
}
if (this.compOutputs) {
Object.getOwnPropertyNames(this.compOutputs).forEach(field => {
instance[field].subscribe(e => {
this.compOutputs[field]();
});
});
}
}
Я использую этот компонент laoder в компоненте gridster, например:
<gridster [options]="gridsterConfig">
<gridster-item [item]="widget" *ngFor="let widget of board.widgets">
<app-component-loader [compRef]="{ ref: registry.get(widget.outletComponent) }" [compInputs]="{ widget: widget }" [compOutputs]="{ removeCallback: widgetRemoveCallback.bind(this), changed: widgetChanged.bind(this) }"></app-component-loader>
</gridster-item>
</gridster>
Он работает нормально и загружает элементы гридстера и компоненты их розеток во время разработки.
Hovewer сегодня я пытался построить свое приложение с ng build --prod
и развертывание на сервере, я понимаю, что мой загрузчик компонентов не создает компоненты.
Мне не хватает чего-то особенного для динамического создания компонентов для производственных сборок. Я искал об этом, но ничего не получил.
Перед реализацией моего компонента загрузчика компонентов я делал создание этого компонента с помощью пакета ng-dynamic-component, и он снова работал нормально при разработке, но получил исключение, в котором говорится, что экземпляр компонента равен NULL при производстве.
Я думаю, что это не проблема, что способ создания рендеринга компонентов, но нужна помощь.
Кроме того, мои зависимости:
"@angular/animations": "^5.2.9",
"@angular/cdk": "^6.0.2",
"@angular/common": "^5.2.9",
"@angular/compiler": "^5.2.9",
"@angular/core": "^5.2.9",
"@angular/flex-layout": "^5.0.0-beta.14",
"@angular/forms": "^5.2.9",
"@angular/http": "^5.2.9",
"@angular/platform-browser": "^5.2.9",
"@angular/platform-browser-dynamic": "^5.2.9"
"@angular/cli": "^1.7.3",
"@angular/compiler-cli": "^5.2.9",
"@angular/language-service": "^5.2.9",
Спасибо вам всем.
1 ответ
Это то, что работает для меня, создать директиву для просмотра, как показано ниже, в вашем app-component-loader.ts onInIt
@ViewChild(DynamicHostDirective)
hostDirective: DynamicHostDirective
ngOnInIt(){
if (this.compRef && this.compRef.ref) {
this._componentFactory = this._componentFactoryResolver.resolveComponentFactory(this.compRef.ref);
const instance = this.hostDirective.viewContainerRef.createComponent(this._componentFactory).instance;
console.log(instance);
if (this.compInputs) {
Object.getOwnPropertyNames(this.compInputs).forEach(field => {
instance[field] = this.compInputs[field];
});
}
if (this.compOutputs) {
Object.getOwnPropertyNames(this.compOutputs).forEach(field => {
instance[field].subscribe(e => {
this.compOutputs[field]();
});
});
}
}
}
В вашем app-component-loader.html,
<ng-template dynamic-host></ng-template>
наконец, директива хозяина
import {Directive, ViewContainerRef} from '@angular/core';
@Directive({
selector: '[dynamic-host]',
})
export class DynamicHostDirective {
constructor(public viewContainerRef: ViewContainerRef){}
}
Надеюсь, поможет