【发布时间】:2018-05-13 07:51:42
【问题描述】:
我对 html 数字输入的默认行为不满意,我想要一个只接受数字的简单输入。
我创建了这个指令:
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
import { NgControl } from '@angular/forms';
@Directive({
selector: 'input[numbersOnly]'
})
export class NumberDirective {
constructor(private _el: ElementRef) { }
@HostListener('input', ['$event']) onInputChange(event) {
const initalValue = this._el.nativeElement.value;
this._el.nativeElement.value = initalValue.replace(/[^0-9]*/g, '');
if ( initalValue !== this._el.nativeElement.value) {
event.stopPropagation();
}
}
}
我面临的问题是“event.stopPropagation()”不会停止事件传播,即使从用户的角度来看输入值没有改变也会触发一个事件。
当字段值没有改变时如何停止事件传播?
编辑: 为了更好地理解,这是一个 stackblitz 示例: https://stackblitz.com/edit/angular-numbers-only-directive
【问题讨论】:
-
这可能是问题所在。 “您可以使用 Event.cancelable 来检查事件是否可取消。为不可取消的事件调用 preventDefault() 无效。” developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault
-
我已经检查了您的示例,您从指令中捕获的事件是不可取消的。因此,它照常传播。
-
感谢您的回答,您有什么建议可以以干净的方式实现最初的目标吗?非常感谢您对 stackblitz 代码进行编辑。
-
尝试使用 HostListener 'keyDown',而不是 HostListener 'input'
-
@Eliseo 事件仍会使用
keydown触发。
标签: angular typescript angular-directive