angular - Angular 2+如何检测ng-content ContentChild元素是否实现接口
问题描述
我正在编写一个 Angular 2+ 组件,它为其他包含的组件(作为 ng-content 标签提供)提供“修饰”。
例如:
<my-container>
<your-component></your-component>
</my-container>
your-component 成为 TypeScript my-component 代码中的 ContentChild。
但是,如果我能以某种方式检测到组件并询问它是否实现了某个接口(我们称之为 ICanHelpMyComponentDoItsJobBetter),那么我的组件代码可以激活某些附加功能。
我无法弄清楚如何回答“你实现了 ICanHelpMyComponentDoItsJobBetter 接口吗?”这个问题。查看 ContentChild 时在我的组件内部。如果是这样,我想将其转换为该接口实例并进行其他调用或设置其他属性。
任何帮助将不胜感激——这显然是一个高级 Angular 问题。谢谢!
附加信息(2021 年 5 月 4 日):
由于我的 your-content 标签不包含选择器(而且我不想强迫我的用户指定一个),我无法在 TS 文件中使用 @ContentChild('xxx') 。所以这一直是个问题——我不知道如何在我的 TS 代码中把它变成一个可用的成员。
我尝试的另一件事是在 ng-content 周围创建一个 @ViewChild 元素,如下所示:
<div #ngContentDiv>
<ng-content></ng-content>
</div>
所以现在我可以在我的 .ts 文件中有这个:@ViewChild('ngContentDiv') ngContentDiv: ElementRef;
再后来,在 ngAfterContentInit() 东西全部初始化的时候,我可以问:this.ngContentDiv.nativeElement.children[0]
这就是元素——但我似乎不知道如何处理它。
显然,如果有办法将它直接放入@ContentChild,那会更好,但我仍然设法找到有问题的元素,当我检查它时,它确实是我在测试中指出的元素案子。
我已经尝试将其作为接口的实例进行转换——不走运。我尝试使用带有自定义指令的@ContentChildren,然后尝试调用它的方法——仍然没有。
这里不急,但我摸不着头脑——那个组件就在那里——如果我能以某种方式将它转换为它实现的东西,我终于可以要求它帮助促进它的呈现——显然很多人不会实现这个接口,但我不在乎那些。
解决方案
您可以尝试检查组件是否具有您的功能实现
// Check if the component has property i am interested and check if that property is a function
if(!!this.myCustomContentChild['myCustomFeature'] && typeof this.myCustomContentChild['myCustomFeature'] === 'function' ) {
// then call function
this.myCustomContentChild['myCustomFeature']();
}
推荐阅读
- express - swagger-ui-express persistAuthorization 不起作用
- reactjs - 使用 @testing-library/react 的默认值不会发生输入更改
- sql - Azure Synapse 管道:如何将增量更新从 SQL Server 移动到 Synapse 以处理数字
- node.js - Node Js在for循环中获取请求并在对象中收集响应
- c++ - IEEE 754 两个 32 位浮点数的加法(-1 和 2^(-50) )
- c# - C# Webclient 无法下载 api.github.com 页面
- generative-adversarial-network - 我们可以同时训练生成器和判别器吗?
- postgresql - 如何在 postgresql SQL 的字符串中查找文本模式
- node.js - 使用 React 和 Express 在没有谷歌分析的情况下收集页面视图数据
- php - 如何使用单例模式在 php 中正确编写数据库类?