入力イベント(onKeyDown)で@HostListener
を使用するReactiveForm
に通貨属性ディレクティブを組み込み、文字(文字と記号)は入力に入力されたとおりに入力しますが、数字と小数を使用できます。 BUTの場合、空の入力フィールドに無効な文字(すなわち、a
)を入力し、そのディレクティブによって削除されると、のモデルはに更新されません。@HostListenerで@HostListenerでディレクティブを使用してReactiveFormの入力値を更新すると入力がngInvalidではなくngValidに設定されています
通貨指令を使用してplunkerセットアップを追加しました。私の質問を理解するために従うための手順:フォームは(良い)が無効であるため、あなたは何の文字が許可されませんので、入力中a
を得ることはありません、とボタンが無効になっている123a
- タイプ
- あなただけ小数点以下2桁以降の入力で
6
を得ることはありません123.456
タイプが許可されている、とフォームが無効であるため、ボタンが無効になっているあなたが入力にa
を得ることはありませんa
(良い) - タイプ、 しかし モデルは、それはそれで
a
を持っていると考えているのでお尻はUIがそれを表示していなくても有効になっているあなたは、ボタンをクリックし、コンソールを調べて更新したモデルをされていないことを確認することができ
(悪い)this.form.value
を記録し、{ amount: 'a' }
と表示します。次に有効な文字を入力すると、モデルにはその文字のみが含まれ、a
は削除されます。したがって、モデルが正しく更新されないのはこの場合のみです。
これは簡単に$ダイジェストを実行するためにAngularJSを更新し、強制的にngModel validator and parser pipes
、modelValue
、$setViewValue
、および$render()
を使用してAngularJSで解決される問題でした。どのようにAngularでこれを行いますか?
この
が正常に不要な文字をトリム、私の属性ディレクティブからの抜粋です:新しいディレクティブが、これらのシナリオを処理するために導入され、最近の角度4リリースでは@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