gpt4 book ai didi

angular - 如何呈现实现接口(interface)的组件?

转载 作者:太空狗 更新时间:2023-10-29 18:07:27 24 4
gpt4 key购买 nike

假设我有一个接口(interface)(或实际组件)ListItemRenderer和一个组件 MyRendererComponent实现该接口(interface)(或扩展基本组件)

@Component({
selector: 'my-renderer',
template: '<div>My renderer</div>'
})
export class MyRendererComponent implements ListItemRenderer {
...
}

我想将这个具体实现传递给另一个组件,例如

@Component({
selector: 'my-list',
template: `
<ul [renderer]="renderer" [items]="items">
<li *ngFor="let item of items">
<!-- what goes here? -->
</li>
</ul>
`
})
export class MyList {
@Input() renderer: ListItemRenderer;
@Input() items: any[];
...
}

显然,父组件会有一个公共(public)属性 renderer类型 ListItemRenderer .问题是,如何在我的 <li> 中使用该组件? (参见上面的“这里有什么?”)?

最佳答案

要使用*ngFor 动态添加组件,您需要像https://stackoverflow.com/a/36325468/217408 中解释的dcl-wrapper 这样的东西。 (DynamicComponentLoader 已被弃用,取而代之的是 ViewContainerRef.createComponent(),但我没有尝试为包装器组件引入另一个名称。)

@Component({
selector: '[dcl-wrapper]', // changed selector in order to be used with `<li>`
template: `<div #target></div>`
})
export class DclWrapper {
@ViewChild('target', {read: ViewContainerRef}) target;
@Input() type;
cmpRef:ComponentRef;
private isViewInitialized:boolean = false;

constructor(private resolver: ComponentResolver) {}

updateComponent() {
if(!this.isViewInitialized) {
return;
}
if(this.cmpRef) {
this.cmpRef.destroy();
}
this.resolver.resolveComponent(this.type).then((factory:ComponentFactory<any>) => {
this.cmpRef = this.target.createComponent(factory)
});
}

ngOnChanges() {
this.updateComponent();
}

ngAfterViewInit() {
this.isViewInitialized = true;
this.updateComponent();
}

ngOnDestroy() {
if(this.cmpRef) {
this.cmpRef.destroy();
}
}
}

像这样使用它

@Component({
selector: 'my-list',
template: `
<ul [items]="items">
<li *ngFor="let item of items" dcl-wrapper [type]="renderer" ></li>
</ul>
`
})
export class MyList {
@Input() renderer: ListItemRenderer;
@Input() items: any[];
...
}

关于angular - 如何呈现实现接口(interface)的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37154552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com