浮動小数点ディレクティブを反応形式のフィールドに追加して、カンマを1000に追加し、フィールド値に.00
を追加します。 。角4 valueChangesを使用するのではなく、setValueまたはpatchValueをリッスンします。
- onBlurイベントがのonFocus、値は以下のように一度フォーマットされたので、私は私の浮動小数点命令にこれを追加して既存の値を持つフォームの負荷が、私はこれらの値をフォーマットすることがしたかった場合
をフォーマット削除
setValue
またはpatchValue
を使用して塗りつぶします。浮動小数点指令 public ngOnInit() {
this.formatFloat();
}
private formatFloat() {
const handle = this.ngControl.valueChanges
.subscribe((value: string) => {
const float = this.getFloat();
if (float) {
this.element.value = this.format(value);
}
handle.unsubscribe();
});
}
から
スニペットは**下記のフルディレクティブを追加しましたが、これは本当に重要部分のみです。
フォームフィールドをFormArrayに動的に追加して空のフォームを記入すると、1回の書式設定がトリガーされないため、フィールドに入力する最初の桁が書式を追加します。たとえば、空のフォームを開き、ダイナミックフィールドを追加するボタンをクリックし、フィールドに1
と入力すると、valueChange
が入力され、入力には1.00
が入力され、ユーザーは11244
の代わりに1.001244
と入力し続けます。
私はpatchValue
知っているとsetValue
は直接emitEvent
docsを通じてvalueChanges
にリンクされているが、代わりにvalueChanges
のリスニングのsetValue
またはpatchValue
変更をリッスンする方法はありますか?あるいは、これを実現させる別の方法はありますが、ちょうどちょうどsetValue
とpatchValue
を聞いても、1回のフォーマットのサブスクリプションがまだ生き残っていることになるので、既存の機能があります。
浮動小数点指令
import { Directive, HostListener, ElementRef, OnInit } from '@angular/core';
import { DecimalPipe } from '@angular/common';
import { FormGroup, NgControl } from '@angular/forms';
@Directive({
selector: '[cfFloat]',
providers: [DecimalPipe] // TODO: why do I need this?
})
export class FloatDirective implements OnInit {
public element: HTMLInputElement;
constructor(
private elementRef: ElementRef,
private decimalPipe: DecimalPipe,
private ngControl: NgControl
) {
this.element = this.elementRef.nativeElement;
}
@HostListener('blur', ['$event'])
onBlur(event: KeyboardEvent) {
const float = this.getFloat();
if (float) {
this.element.value = this.format(float);
}
}
@HostListener('focus', ['$event'])
onFocus(event: KeyboardEvent) {
const float = this.getFloat();
if (float) {
this.element.value = this.replace(float);
}
}
public ngOnInit() {
this.formatFloat();
}
private formatFloat() {
const handle = this.ngControl.valueChanges
.subscribe((value: string) => {
const float = this.getFloat();
if (float) {
this.element.value = this.format(value);
}
handle.unsubscribe();
});
}
private getFloat(): string {
const value = this.element.value;
const float = this.replace(value);
// Only perform an action when a floating point value exists and there are
// no errors, otherwise leave the erroneous value to be fixed manually by
// ignoring an action
if (value && float && this.checkIsValid()) {
return float;
}
}
private checkIsValid(): boolean {
return !this.ngControl.control.errors;
}
private replace(value: string): string {
return value.replace(/[^\d\.]+/g, '');
}
private format(value: string) {
return this.decimalPipe.transform(value, '1.2-2');
}
}