Angular 角度6:给定ElementRef,我可以得到ViewContainerRef吗

Angular 角度6:给定ElementRef,我可以得到ViewContainerRef吗,angular,Angular,模板 <div my-directive></div> 因此,该服务需要一个ViewContainerRef和一个ElementRef。我必须两个都通过吗?有没有从元素ref派生视图容器的方法?如果是这样,我只需要将ElementRef传递给服务,它就会从中获取视图容器 或者,ElementRef是否可以从ViewContainerRef派生?似乎不可能,因为我假设一个视图容器可以有多个元素。您可以使用视图中的元素引用。它们都引用相同的DOM元素 constructor

模板

<div my-directive></div>
因此,该服务需要一个
ViewContainerRef
和一个
ElementRef
。我必须两个都通过吗?有没有从元素ref派生视图容器的方法?如果是这样,我只需要将
ElementRef
传递给服务,它就会从中获取视图容器


或者,
ElementRef
是否可以从
ViewContainerRef
派生?似乎不可能,因为我假设一个视图容器可以有多个元素。

您可以使用视图中的元素引用。它们都引用相同的DOM元素

constructor(vc: ViewContainerRef, el: ElementRef, svc: MyService) {
     console.log(vc.element.nativeElement === el.nativeElement);
     // prints true
     this.svc.doWork(vc, vc.element);
}

构造函数注入有什么问题吗?@antoniosss不确定我是否理解你为什么这么问。不管怎样,我都要注射。只是想知道我是否在复制可以简化的东西。这种简化会在我的应用程序的其他地方产生积极的连锁反应。我想知道的是,例如vc.getElementRef(某物)或其他方式会产生如此大的影响,因此值得进行“研究”for@cgTag只需发布我想要的答案,但无论如何,在传递DOM元素时要小心,这是一种非常糟糕的做法,并且对XSS atacks开放。您没有提到这一点的目的,但这只是一个旁注。@cgTag,另外,您可以在“安全性”一节中了解更多信息。
constructor(vc: ViewContainerRef, el: ElementRef, svc: MyService) {
     console.log(vc.element.nativeElement === el.nativeElement);
     // prints true
     this.svc.doWork(vc, vc.element);
}