javascript - Angular:有一种方法可以与指令中的二级子组件交互吗?
问题描述
在 HTML 模板中,我有以下实现:
<tr sliding>
<td>Field 1</td>
<td>Field 2</td>
<td>
<app-sliding>Field 3</app-sliding>
</td>
</tr>
我有以下指令:
@Directive({
selector: '[sliding]'
})
export class SlidingDirective {
@HostListener('mouseenter', ['$event'])
public onHover(e: Event): void {
const el = e.target as HTMLElement;
const appSliding = el.querySelector('app-sliding') as AppSlidingComponent;
if (cdSliding) {
appSliding.show();
}
}
}
以及以下组件:
@Component({
selector: 'app-sliding',
template: `
<ng-content></ng-content>
`
})
export class AppSlidingComponent {
show() {
console.log('yes');
}
}
我希望当鼠标悬停在DOM 元素上时,<tr>
指令调用show()
.AppSlidingComponent
我尝试使用 @ViewChild 实现,但我看不到第二级孩子。
querySelector
找到 DOM 元素,但被视为 HTMLElement,而不是 AppSlidingComponent。
有一种方法可以与指令中的子组件交互吗?
解决方案
使用ContentChild inside 指令来获取投影的组件实例。
@ContentChild
(SlidingComponent, {static:false}) compInst:SlidingComponent;
@HostListener('mouseenter', ['$event'])
public onHover(e: Event): void {
const el = e.target as HTMLElement;
const appSliding = el.querySelector('app-sliding');
this.compInst.show();
}
constructor() { }
}
推荐阅读
- java - Spring Boot 从属性中获取类名列表并加载到 HashMap
- ios - 将 SwiftUI 与多个 UIGestureRecognizer 一起使用?
- spring - 如何构建不与数据库交互的 Spring Boot 项目
- airflow - 带有 Docker 的气流:任务尚未开始
- identityserver4 - identityserver4 api访问慢
- performance - 古斯塔夫森定律试图论证什么?
- javascript - Heroku 部署:单页应用程序作为前端和表达作为后端
- shopify-app - Shopify 应用程序——在应用程序安装期间,它重定向到非嵌入式页面
- android - FLUTTER ANDROID Gradle 版本
- sql - 使用比较构建嵌套查询