All*_*yar 6 angular angular-dynamic-components
我将动态地将组件与服务中的另一个组件进行比较,首先,在服务工厂中同时对两个组件进行创建,然后创建可以访问ViewContainer的组件。但是无法创建组件!
服务内容:
@Injectable({
providedIn: 'root'
})
export class ModalService {
componentRef: ComponentRef<ModalTemplateComponent>;
constructor(private _modalService: BsModalService,
private resolver: ComponentFactoryResolver,
private injector: Injector) {
}
open(componentType: any) {
const contentFactory = this.resolver
.resolveComponentFactory(componentType);
const templateFactory = this.resolver
.resolveComponentFactory(ModalTemplateComponent);
const componentRef = templateFactory.create(this.injector);
componentRef.instance.container.createComponent(contentFactory);
this._modalService.show(componentRef.componentType, {class: 'modal-lg', initialState: {data: {test:true}});
}
}
Run Code Online (Sandbox Code Playgroud)
零件 :
selector: 'lib-modal-template',
template: `
<h1>{{title}}</h1>
<ng-container #container>
</ng-container>
`,
styleUrls: ['./modal-template.component.css']
})
export class ModalTemplateComponent implements OnInit {
title:string;
@ViewChild('container', {read: ViewContainerRef, static: true}) container: ViewContainerRef;
}
Run Code Online (Sandbox Code Playgroud)
例如:
this._modalService.open(NewUserForm,...);
ModalTemplateComponent首先,此行将创建, 而不是 的新实例componentRef,因此您不会在同一个实例上工作。
this._modalService.show(componentRef.componentType, {class: 'modal-lg', initialState: {data: {test:true}}});
Run Code Online (Sandbox Code Playgroud)
我做了一些调整(使用ngComponentOutlet),它将按您的预期工作:
模态服务
@Injectable({
providedIn: 'root'
})
export class ModalService {
constructor(private _modalService: BsModalService,
private resolver: ComponentFactoryResolver,
private injector: Injector) {
}
open(componentType: any) {
const ref = this._modalService.show(ModalTemplateComponent, {class: 'modal-lg', initialState: {data: {test:true}}});
(ref.content as ModalTemplateComponent).componentType = componentType;
}
}
Run Code Online (Sandbox Code Playgroud)
模态模板组件
@Component({
selector: 'app-modal-template',
template: `
<h1>{{title}}</h1>
<ng-container *ngComponentOutlet="componentType">
</ng-container>
`,
styleUrls: ['./modal-template.component.css']
})
export class ModalTemplateComponent implements OnInit {
title: string = 'modal-template';
@Input() componentType: any;
constructor() { }
ngOnInit() {
}
}
Run Code Online (Sandbox Code Playgroud)
在线演示:https://stackblitz.com/edit/angular-1srnej ?file=src%2Fapp%2Fmodal.service.ts
===============================
如果您想使用动态组件实例,我们可以使用以下解决方案:
模态模板组件
@Component({
selector: 'app-modal-template',
template: `
<h1>{{title}}</h1>
<ng-container #container>
</ng-container>
`,
styleUrls: ['./modal-template.component.css']
})
export class ModalTemplateComponent implements OnInit, OnDestroy {
title: string = 'modal-template';
component: any;
componentRef: ComponentRef<any>;
@Input() set componentType(c: any) {
this.component = c;
this.renderContent();
}
@ViewChild('container', {
read: ViewContainerRef,
static: true
}) container: ViewContainerRef;
constructor() { }
ngOnInit() {
}
renderContent() {
this.container.clear();
const injector = this.container.injector;
const cfr = injector.get(ComponentFactoryResolver);
const componentFactory = cfr.resolveComponentFactory(this.component);
const componentRef = this.container.createComponent<any>(componentFactory);
componentRef.instance.content = 'content from ' + this.title;
this.componentRef = componentRef;
}
ngOnDestroy() {
if (this.componentRef) {
this.componentRef.destroy();
}
}
}
Run Code Online (Sandbox Code Playgroud)
警报内容组件
export class AlertContentComponent implements OnInit {
@Input() content = '';
constructor() { }
ngOnInit() {
}
}
Run Code Online (Sandbox Code Playgroud)
演示: https: //stackblitz.com/edit/angular-ythykh?file =src%2Fapp%2Fmodal-template%2Fmodal-template.component.ts
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |