微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Angular 2+ 如何检测 ng-content ContentChild 元素是否实现了接口

如何解决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 时在 my-component 内部。如果是,我想将其转换为该接口实例并进行其他调用或设置其他属性

任何帮助将不胜感激——这显然是一个高级的 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']();

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。