与えられたパターンと一致しない文字が入力に入力されないようにする指示文を作成しました。Angular2正規表現と一致しない文字を防ぐためのカスタムディレクティブ
import { Directive, Input, Output, HostListener, EventEmitter } from "@angular/core"
@Directive({
selector: '[ngModel][typingPattern]'
})
export class TypingPatternDirective {
@Input() typingPattern: string
@Input() ngModel
@Output() ngModelChange = new EventEmitter()
@Input() global: boolean = true // Global modifier
private oldValue: any
/* On key down, we record the old value */
@HostListener('keydown', ['$event'])
onKeyDown($event) {
this.oldValue = $event.target.value
}
@HostListener('input', ['$event'])
onInput($event) {
if (!$event.target.value.match(new RegExp(this.typingPattern, this.global ? 'g' : ''))) {
$event.target.value = this.oldValue.trim()
}
this.ngModelChange.emit($event.target.value)
}
@HostListener('paste', ['$event'])
onPaste($event) {
this.onInput($event)
}
}
そして、ここで私が入力要素でそれを使用する方法である:
<input type="text" [ngModel]="..." [typingPattern]="$[0-9]{0,8}^" required>
その特定の例では、私はh
のような任意の文字を入力する場合、私は現在持っている唯一のバグが発生します。キーは私のディレクティブで防ぐことができますが、ngModelの値が空で何も表示されていなくても、文字は追加されているとみなされ、入力はvalid
に設定されます。私はおそらくevent.preventDefault()
する必要がありますが、私はどこにわからない。
代わりに、パターンバリデーターを使用しないでください。私は事実ではないことを知っていますが、アプローチです –