如何将点击处理程序附加到投影的内容元素
How to attach click handler to projected content element
我正在使用内容投影将按钮放入组件中。
<hello name="{{ name }}">
<button #btn>Click Me</button>
</hello>
和组件:
@Component({
selector: 'hello',
template: `
<h3>Hello {{name}}!</h3>
<ng-content></ng-content>
`
})
到目前为止一切顺利...但我现在想向该按钮添加一个(单击)事件侦听器,并且我希望处理程序存在于接收投影内容的组件中。
我希望执行以下操作来访问原生元素,然后添加点击监听器。
@ViewChild('btn') btn
不幸的是,当我在 ngAfterViewInit 中控制台记录 this.btn 时,我得到一个 "undefined"。即使它确实有效,我认为必须有更多 angular 方式来附加侦听器而不是访问本机元素。
完成此任务的最佳方法是什么?
stackblitz 示例:https://stackblitz.com/edit/angular-cj4bz1?file=src%2Fapp%2Fhello.component.ts
您可以使用 @ContentChild
或 @ContentChildren
来访问组件内的投影子项:
您可以在此处阅读更多相关信息以及与 @ViewChild
和 @ViewChildren
Content Child Docs
的相同点和不同点
获得访问权限后 Child/Children 您可以使用类似 rxjs 的东西和 From Event 运算符来获取点击事件。
fromEvent(this.mycontentchildelement, 'click').subscribe((event) => console.log('got clicked', event));
我正在使用内容投影将按钮放入组件中。
<hello name="{{ name }}">
<button #btn>Click Me</button>
</hello>
和组件:
@Component({
selector: 'hello',
template: `
<h3>Hello {{name}}!</h3>
<ng-content></ng-content>
`
})
到目前为止一切顺利...但我现在想向该按钮添加一个(单击)事件侦听器,并且我希望处理程序存在于接收投影内容的组件中。
我希望执行以下操作来访问原生元素,然后添加点击监听器。
@ViewChild('btn') btn
不幸的是,当我在 ngAfterViewInit 中控制台记录 this.btn 时,我得到一个 "undefined"。即使它确实有效,我认为必须有更多 angular 方式来附加侦听器而不是访问本机元素。
完成此任务的最佳方法是什么?
stackblitz 示例:https://stackblitz.com/edit/angular-cj4bz1?file=src%2Fapp%2Fhello.component.ts
您可以使用 @ContentChild
或 @ContentChildren
来访问组件内的投影子项:
您可以在此处阅读更多相关信息以及与 @ViewChild
和 @ViewChildren
Content Child Docs
获得访问权限后 Child/Children 您可以使用类似 rxjs 的东西和 From Event 运算符来获取点击事件。
fromEvent(this.mycontentchildelement, 'click').subscribe((event) => console.log('got clicked', event));