以下代码片段与*ngComponentOutlet
一起用于显示。
我有以下工作代码:
this.displayComponent({
'objects':[
{component: ToDisplayAComponent, expanded: false},
{component: ToDisplayBComponent, expanded: false}
]
})
对象值数组将用
*ngFor
迭代,并显示我的组件。我要做的是下面的方法不起作用(在数组中传递同一个抽象组件的不同实例,这些实例用不同的属性初始化):
let compA = new ToDisplayAComponent(aProperty);
let compB = new ToDisplayAComponent(anotherPropert);
this.displayComponent({
'objects':[
{component: compA, expanded: false},
{component: compB, expanded: false}
]
});
除了解决我的问题,这将是非常感谢,我也非常感兴趣,发生了什么,上面的代码不起作用。
PS编译但抛出此错误:
ERROR Error: No component factory found for [object Object]. Did you add it to @NgModule.entryComponents?
最佳答案
角度编译器读取您在entryComponents
的@NgModule
中指定的组件,并为它们创建工厂。ngComponentOutlet
指令然后使用componentFactoryResolver
获取这些工厂,然后创建组件实例。下面是来自源代码的相关代码:
@Directive({selector: '[ngComponentOutlet]'})
export class NgComponentOutlet implements OnChanges, OnDestroy {
@Input() ngComponentOutlet: Type<any>;
ngOnChanges(changes: SimpleChanges) {
...
const componentFactory=componentFactoryResolver.resolveComponentFactory(this.ngComponentOutlet);
this._componentRef=this._viewContainerRef.createComponent(componentFactory,...)
既然您的第一个示例起作用了,我假设您已经将
ToDisplayAComponent
和ToDisplayAComponent
添加到如下条目组件:@NgModule({
entryComponents: [ ToDisplayAComponent, ToDisplayBComponent ]
所以当
componentOutlet
这样请求时:resolveComponentFactory(this.ngcomponentoutlet)
this.ngComponentOutlet
保存一个类引用,因此它与您在ToDisplayAComponent
中指定的内容成功匹配:entryComponents[0] === this.ngComponentOutlet (ToDisplayAComponent)
但是,在第二个示例中,您不传递类引用,而是传递实例,显然它们不匹配:
entryComponents[0] !== this.ngComponentOutlet (new ToDisplayAComponent())
^^^^^
这就是为什么Angular报告在入口组件中找不到组件工厂的错误。
你想做的事是做不到的。您无法将自定义参数传递给组件类构造函数,因为它是在依赖注入上下文中实例化的。因此,如果需要传递到组件类中的构造函数,则定义了提供程序。
要了解更多有关动态组件的知识,请阅读AA>
关于angular - Angular 4-需要澄清* ngComponentOutlet,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46367367/