Angular 6 - 指令输出同时触发所有组件
Angular 6 - Directive Output is firing for all components in the same moment
我有一个包含四个 datePicker 组件的表单,用户只能 select 日历中的日期,但不能对其进行编辑。我创建了一个指令,允许在用户单击取消和退格按钮时取消日期。
现在的问题是该指令的输出同时触发了所有四个 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>
同时触发所有 DatePicker 组件的 deleteDate 方法
您的主机侦听器在 window:keydown
上,这意味着您正在侦听每个指令中整个 window 上的所有按键事件。
只需将其更改为:
@HostListener('keydown', ['$event'])
让它只是元素 keydown
我有一个包含四个 datePicker 组件的表单,用户只能 select 日历中的日期,但不能对其进行编辑。我创建了一个指令,允许在用户单击取消和退格按钮时取消日期。
现在的问题是该指令的输出同时触发了所有四个 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>
同时触发所有 DatePicker 组件的 deleteDate 方法
您的主机侦听器在 window:keydown
上,这意味着您正在侦听每个指令中整个 window 上的所有按键事件。
只需将其更改为:
@HostListener('keydown', ['$event'])
让它只是元素 keydown