首页 > 解决方案 > Angular 6 - 指令输出同时触发所有组件

问题描述

我有一个包含四个 datePicker 组件的表单,用户只能从日历中选择日期,但他们不能编辑它。我创建了一个指令,允许在用户单击canc & backspace 按钮时取消日期。

在此处输入图像描述


现在的问题是,该指令的输出同时触发了所有四个 datePicker 组件,并且所有这些组件的日期都被取消了。

这是指令的代码:

@Directive({
  selector: '[atenaAllowDeleteOnly]',
})
export class AllowDeleteOnlyDirective {

  @Output() updatedVal = new EventEmitter(); // emitted Current Value
  constructor(private model: NgModel) { }

  @HostListener('window:keydown', ['$event'])
  keyEvent(event: KeyboardEvent) {
    event.preventDefault();
    if ((event.keyCode == 8 || event.keyCode == 46)) {
      this.updatedVal.emit(null);
    }

  }

}

日期选择器组件:

<div class="input-group body-input">
    <button class="close" type="button"></button>
    <input [readonly]="false" 
           id ="date-{{id}}" 
           atenaAllowDeleteOnly
           (updatedVal)="deleteDate($event)"
           (ngModelChange)="onSelectDate($event)" 
           attr.aria-describedby="{{label}}" 
           class="form-control"
           [class.datePicker-border]="!_isReadOnly" 
           placeholder="gg/mm/aaaa" [name]="name"   
           [(ngModel)]="valueApp" ngbDatepicker #d="ngbDatepicker">
    <img src="../../../../../Atena/assets/img/icons/calendar.svg"
         (click)="_isReadOnly ? null :  d.toggle()" alt>
 </div>

deleteDate 方法同时触发所有 DatePicker 组件

标签: javascriptangulartypescriptangular6angular2-directives

解决方案


您的主机侦听器是 on window:keydown,这意味着您正在侦听每个指令中整个窗口上的所有 keydown 事件。

只需将其更改为:

@HostListener('keydown', ['$event'])

让它只是元素keydown


推荐阅读