【问题标题】:How to attach click handler to projected content element如何将点击处理程序附加到投影的内容元素
【发布时间】:2018-08-28 20:48:41
【问题描述】:

我正在使用内容投影将按钮放入组件中。

<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 时,我得到一个“未定义”。即使它确实有效,我认为附加监听器的方式必须比访问本机元素更具角度。

最好的方法是什么?

stackblitz 示例:https://stackblitz.com/edit/angular-cj4bz1?file=src%2Fapp%2Fhello.component.ts

【问题讨论】:

  • 为什么不在按钮上(click)
  • 如果我将 (click)="onClick()" 添加到按钮 html 中,它将尝试绑定到组件的父 onClick 方法
  • 为什么要绑定到孩子身上?
  • 我希望不同的父母为组件提供不同的模板定制。绑定到孩子会让我重用处理程序代码。

标签: angular viewchild ng-template


【解决方案1】:

您可以使用@ContentChild@ContentChildren 来访问组件内的投影子项:

您可以在此处阅读有关它的更多信息以及与@ViewChild@ViewChildren Content Child Docs 的异同

在您访问您的 Child/Children 后,您可以使用类似 rxjs 和 From Event 运算符来获取点击事件。

fromEvent(this.mycontentchildelement, 'click').subscribe((event) => console.log('got clicked', event));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多