Angular - HostListener 指令和传递值

Posted

技术标签:

【中文标题】Angular - HostListener 指令和传递值【英文标题】:Angular - HostListener directive and pass value 【发布时间】:2020-08-21 07:49:41 【问题描述】:

我正在尝试使用“innerhtml”传递带有点击事件的 div。由于(点击)不起作用,我尝试使用 HostListener 来获取 id。但它似乎甚至不能在 innerHTML 中传递 id。

HTML 代码

<div [innerHTML]="show" detectClick></div>

主机监听器

@HostListener('click', ['$event.target.id']) onClick(id: any) 
    alert(`You clicked on $id`);
    this.test = id;
 

要动态添加的代码

this.show = this.sanitizer.bypassSecurityTrustHtml(`<div class="clickarea"><span id="123" (click)="showID('123');">x</span></div>`);

链接到StackBlitz

【问题讨论】:

我想你已经注意到它不会在 HTML 中呈现 id。也可以搜索DomSanitizer 感谢您的友好建议。我在 StackBlitz 中添加了 DomSanitizer,它现在显示 id 并且 HostListener 正在工作。但是 (click)="showID('123')" 仍然无法正常工作。任何想法如何解决这个问题? 【参考方案1】:

您不能在 innerHTML 中使用 Angular 特定属性,例如 (click)[prop]

但是是的,您可以通过@HostListener 装饰器使用事件委托来获得点击id

detectclick.directive.ts

import  Directive, Output, HostListener, EventEmitter  from '@angular/core';

@Directive(selector: '[detectClick]')
export class DetectClick 

  @Output() detectClick = new EventEmitter();

  @HostListener('click', ['$event.target.id']) onClick(id: any) 
    this.detectClick.emit(id);
   

parent.html

<div [innerHTML]="show" (detectClick)="showID($event)"></div>

Forked Stackblitz

【讨论】:

救命稻草。谢谢!

以上是关于Angular - HostListener 指令和传递值的主要内容,如果未能解决你的问题,请参考以下文章

Angular 使用带有 @HostListener 的指令来更新 ReactiveForm 的输入值是将输入设置为 ngValid 而不是 ngInvalid

打字稿 | JavaScript | Angular 2:动态设置@HostListener 参数

Angular:来自指令的 updateValueAndValidity

Angular 指令创建重复元素

Angular - Textarea 指令 maxHeight

Angular 2. 删除 @Hostlistener()