angular - 如何从指令中访问某种类型的所有子组件?
问题描述
我已经查看了许多不同的线程,但仍然没有找到任何适合我的东西。我能找到的最接近的东西似乎很久以前就被弃用了:https ://github.com/angular/angular/issues/8277
基本上,我正在使用一些开箱即用的 3rd 方组件,它们不能很好地协同工作,因此我着手编写一个指令,我可以附加到一个指令上并处理一些自定义逻辑。布局看起来像这样:
<splitter myDirective>
<split-panel>
<my-component-1>
<div>
<pivot-grid></pivot-grid>
</div>
</my-component-1>
</split-panel>
<split-panel>
<my-component-2>
<div>
<pivot-grid></pivot-grid>
</div>
</my-component-2>
</split-panel>
</splitter>
拆分器允许在运行时调整大小。在我的指令中,我可以访问拆分器组件及其ElementRef
. 我目前正在做的是在children
递归上挖掘ElementRef.nativeElement
,然后在我的PivotGridComponent
using上设置高度Renderer2
。但是,问题是对第 3 方有一个警告,PivotGridComponent
因为我必须设置组件height
本身的属性,否则我没有滚动条。
我试过了@ViewChildren
,@ContentChildren
但@host() @self() @optional()
这些都不能抓住我的底层PivotGridComponent
。我本来只是放入@ViewChildren
拆分器组件本身,但这也是第 3 方组件,所以它不是一个选项。似乎也无法以与导航树相同的方式导航组件ElementRef
树。
如何从指令中访问组件?我猜它不再可能从ElementRef
我链接的 GitHub 问题中获取组件。
解决方案
您可以使用@ContentChildren
从更高的组件/指令中检索子组件。每当添加、删除或移动子元素时,查询列表都会更新,查询列表的可观察更改将发出一个新值。
这是一个例子:
@ContentChildren(SplitPanelComponent) public splitPanelComponents: QueryList<SplitPanelComponent>;
您可以在指令或Splitter
组件中使用它(您在其中应用指令)并将其传递给指令。
如果您想要一个更具体的示例,您可以查看我也在使用的库的代码示例@ContentChildren
。
这里的工作示例。