我已經把貨幣屬性指令在ReactiveForm
FormControl
上輸入事件(的onkeydown)使用@HostListener
刪除所有無效字符(字母和符號),因爲它們被輸入到輸入中,但允許數字和小數。 但是,如果您輸入一個無效字符(即a
)到一個空的輸入字段並且它被指令刪除,則的型號不是已更新。角使用指令與@HostListener到更新ReactiveForm的輸入值設置輸入到ngValid代替ngInvalid
我已經使用貨幣指令添加了一個plunker設置。要遵循的步驟明白我的問題:
- 型
123a
你不要在輸入的a
因爲沒有字母是允許的,並且該按鈕被禁用,因爲形式是無效的(好) - 類型
123.456
你不要在輸入6
因爲只有2位小數是允許的,並且該按鈕被禁用,因爲形式是無效的(好) - 型
a
你不輸入獲得a
,但是對接啓用,因爲該模型認爲它有一個a
在它,即使用戶界面不顯示它(壞)
可以驗證模型不是通過點擊按鈕,並期待在控制檯更新,其日誌this.form.value
,並顯示{ amount: 'a' }
。如果您接下來輸入有效的字符,模型將只包含該字符,並且a
將被刪除。所以只有在這種情況下,模型才能正確更新。
這是使用ngModel validator and parser pipes
在AngularJS容易解決的問題,modelValue
,$setViewValue
,並且$render()
更新和力AngularJS運行$摘要。你如何在Angular中做到這一點?
這是從我的屬性指令代碼,可成功地修剪掉不需要的字符:
@HostListener('input', ['$event'])
onKeyDown(event: KeyboardEvent) {
const input = event.target as HTMLInputElement;
// Only numbers and decimals
let trimmed = input.value.replace(/[^\d\.,]+/g, '');
// Only a single decimal and choose the first one found
if (trimmed.split('.').length > 2) {
trimmed = trimmed.replace(/\.([^\.]*)$/, '$1');
}
// Cannot start with decimal typed or pasted
if (trimmed.indexOf('.') === 0) { trimmed = ''; }
// AngularJS "like" solution would be something like:
// ngModelCtrl.$setViewValue(trimmed);
// ngModelCtrl.$render();
// Angular solution is???
input.value = trimmed;
}
注入NgControl爲我做了竅門,謝謝。 – Hasan