从Directive到Parent元素发出事件

raj*_*aju 14 html dom-events angular-directive angular

我在HTML模板中有一个元素.我给它添加了一个指令:

<div myCustomDirective>HELLO</div>
Run Code Online (Sandbox Code Playgroud)

我希望每当我将鼠标悬停在div文本里面时都div应该更改,但是需要从Directive (mouseover)事件中完成.

我不知道如何从a发出事件Directive并捕获父元素内部.

任何帮助表示赞赏.这是angular2项目.

Gün*_*uer 45

如果myCustomDirective有输出 @Output() someEvent:EventEmitter = new EventEmitter();则可以使用

<div myCustomDirective (someEvent)="callSomethingOnParent($event)">HELLO</div>
Run Code Online (Sandbox Code Playgroud)

  • 你不能.要与路由器添加的组件进行通信,请使用共享服务(理想情况下使用observable来推送新事件). (3认同)

Ale*_*mov 12

我想添加@GünterZöchbauer的答案,如果你试图从结构指令发出一个事件并*在应用指令时使用asterisk()语法,它将无法工作.@Output如果与*语法一起使用,Angular 5.2.6仍然不支持结构指令的绑定(请参阅GitHub问题).

你必须将它转换为脱糖形式(见这里),即:

<ng-template [customDirective]="foo" (customDirectiveEvent)="handler($event)">
  <div class="name">{{hero.name}}</div>
</ng-template>
Run Code Online (Sandbox Code Playgroud)

代替:

<div *customDirective="foo" (customDirectiveEvent)="handler($event)" class="name">{{hero.name}}</div>
Run Code Online (Sandbox Code Playgroud)

  • 这才救了我-好的答案!也没有警告/错误 (2认同)
  • 还有我的感谢——可能让我免于度过一个效率低下的下午:D (2认同)
  • 只是提一下,结构指令中的事件发射器从 Angular 7 开始仍然无法工作。 (2认同)
  • 结构指令内的事件发射器在角度 10 中仍然无法工作... (2认同)
  • Angular 12 也是如此。 (2认同)

Jos*_*igo 8

您还可以对指令使用相同的名称@Output

@Directive({
  selector: '[myCustomMouseover]'
})
export class MyCustomMouseoverDirective {
  @Output()
  public myCustomMouseover = new EventEmitter<void>();

  @HostListener('mouseover', ['$event'])
  public onMouseover(event: MouseEvent): void {
    if (/* only trigger in certain conditions */) {
       this.myCustomMouseover.emit();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在任何元素中使用,如下所示:

<div (myCustomMouseover)="handler()">
  ...
</div>
Run Code Online (Sandbox Code Playgroud)

  • 不过,对我来说,这看起来是一个优雅的解决方案。所以我认为这取决于个人喜好。当然,如果您将其命名为 dblClick - 可能会令人困惑。但是,如果您将其命名为上面的示例中的“myCustomMouseover”,那么它绝对不会与内置事件混淆。而且 html 变得更容易阅读(毫无疑问为什么有两个属性而不是一个自定义属性)。最终,每当有人感到困惑时,在 WebStorm 和 VS Code(以及大多数其他 IDE)中,很容易通过 Cmd+单击属性名称来转到其定义并查看其背后的内容。 (3认同)