总结我想要完成的事情
- 将组件动态添加到
ViewContainerRef
(完成) - 用属性初始化这些动态组件(完成)
- 访问动态创建的 Component 实例,以便我可以根据实际情况做出决定。
问题
- 动态添加组件时,它们被添加到
ViewContainerRef
ViewContainerRef
提供方法,例如get(index)
returnViewRef
。ViewRef
似乎与Component
实例没有任何关系,这使得获取所需数据成为一项挑战
这是一个 Stackblitz 链接,其工作代码如下所示(用于动态创建组件)
首先使用appComponent
创建一些组件ComponentFactoryResolver
,然后将它们添加到ViewChild
模板中定义的内容中。每个都使用我们在创建后尝试引用DynamicComponent
的属性值进行初始化id
@Component({
selector: "my-app",
template: `
<h3>Retrieving Component Reference for Dyamic Compnents</h3>
<button (click)="getCompRef()">Get References</button>
<div>
<ng-container #childCont></ng-container>
</div>
<div>
<small>List out the Ids from the dynamic components</small> <br />
{{ createdItemIds | json }}
</div>
`,
styleUrls: ["./app.component.css"]
})
export class AppComponent implements AfterViewInit {
@ViewChild("childCont", { read: ViewContainerRef })
childCont: ViewContainerRef;
createdItemIds: string[] = [];
itemLimit = 5;
constructor(
private fr: ComponentFactoryResolver,
private cdr: ChangeDetectorRef
) {}
ngAfterViewInit(): void {
for (let i = 0; i < this.itemLimit; i++) {
const factory = this.fr.resolveComponentFactory(DynamicComponent);
const compRef = this.childCont.createComponent(factory, i);
// Set the id of the instance so that we can use it later
compRef.instance.id = i + 1;
this.cdr.detectChanges();
}
}
...
}
添加的DynamicComponent
内容相当简单。为简化起见,它只包含id
我们试图获得的单个属性
@Component({
selector: "dynamic-component",
template: `
<div>Dynamic Component: {{ id }}</div>
`,
styles: [``]
]
})
export class DynamicComponent {
id: number;
}
到目前为止一切都很好。
- 组件是动态创建的
- 组件实例使用 ID 进行初始化,我们可以通过它在 UI 中显示的 fat 看到
问题在于尝试从 DynamicallyCreated 组件中检索 ID 属性。
在 中AppComponent
,当用户单击按钮时,该getCompRef()
方法被调用并循环遍历childCont (ViewContainerRef)
getCompRef(): void {
for (let i = 0; i < this.itemLimit; i++) {
const viewRef = this.childCont.get(i);
// How do I get at the instance of the view in order to obtain id?
// the view Ref doesn't provide access to the instance
// console.log(viewRef);
}
}
但是ViewRef
返回的 fromViewContainerRef.get()
是一个子类,ChangeDetectoreRef
并且不包含对相关实例的任何引用。
在对这个问题进行研究时,它尝试沿着使用的路径ViewChildren
来获取正在创建的列表组件,但这并没有奏效,因为诸如以下问题
- https://github.com/angular/angular/issues/8785
- 或示例假定在模板中使用的指令用于
ViewChildren
selector
已在模板中预定义的组件 - 我看到很多关于一些人希望在拥有 ViewRef 时获得 ViewRef 的问题
Component.instance
,但这在这种情况下没有帮助。
最后我的问题是,
- 有没有一种简单的方法可以从
ViewRef
我缺少的 Component 实例中获取
任何帮助表示赞赏。
谢谢你。