[解決済み] Reactive Forms - フィールドをタッチしたものとしてマークする
2022-10-09 09:56:34
質問
フォームのすべてのフィールドをタッチしたものとしてマークする方法を見つけるのに苦労しています。
主な問題は、私がフィールドに触れていない場合、フォームを送信しようとすると - バリデーションエラーが表示されないことです。私のコントローラには、そのコードの部分のプレースホルダーがあります。
私のアイデアはシンプルです。
- ユーザーが送信ボタンをクリックする
- すべてのフィールドがタッチされたものとしてマークされます
- エラーフォーマッターを再実行し、バリデーションエラーを表示します。
もし、新しいメソッドを実装せずに、送信時にエラーを表示する他のアイデアをお持ちの方がいらっしゃいましたら、ぜひ教えてください。ありがとうございます。
私の簡略化したフォームです。
<form class="form-horizontal" [formGroup]="form" (ngSubmit)="onSubmit(form.value)">
<input type="text" id="title" class="form-control" formControlName="title">
<span class="help-block" *ngIf="formErrors.title">{{ formErrors.title }}</span>
<button>Submit</button>
</form>
そして、私のコントローラ。
import {Component, OnInit} from '@angular/core';
import {FormGroup, FormBuilder, Validators} from '@angular/forms';
@Component({
selector : 'pastebin-root',
templateUrl: './app.component.html',
styleUrls : ['./app.component.css']
})
export class AppComponent implements OnInit {
form: FormGroup;
formErrors = {
'title': ''
};
validationMessages = {
'title': {
'required': 'Title is required.'
}
};
constructor(private fb: FormBuilder) {
}
ngOnInit(): void {
this.buildForm();
}
onSubmit(form: any): void {
// somehow touch all elements so onValueChanged will generate correct error messages
this.onValueChanged();
if (this.form.valid) {
console.log(form);
}
}
buildForm(): void {
this.form = this.fb.group({
'title': ['', Validators.required]
});
this.form.valueChanges
.subscribe(data => this.onValueChanged(data));
}
onValueChanged(data?: any) {
if (!this.form) {
return;
}
const form = this.form;
for (const field in this.formErrors) {
if (!this.formErrors.hasOwnProperty(field)) {
continue;
}
// clear previous error message (if any)
this.formErrors[field] = '';
const control = form.get(field);
if (control && control.touched && !control.valid) {
const messages = this.validationMessages[field];
for (const key in control.errors) {
if (!control.errors.hasOwnProperty(key)) {
continue;
}
this.formErrors[field] += messages[key] + ' ';
}
}
}
}
}
どのように解決するのですか?
次の関数は、フォームグループ内のコントロールに再帰的にアクセスし、そっとタッチします。controlsフィールドはオブジェクトなので、このコードではフォームグループのコントロールフィールドに対してObject.values()を呼び出しています。
/**
* Marks all controls in a form group as touched
* @param formGroup - The form group to touch
*/
private markFormGroupTouched(formGroup: FormGroup) {
(<any>Object).values(formGroup.controls).forEach(control => {
control.markAsTouched();
if (control.controls) {
this.markFormGroupTouched(control);
}
});
}
関連
-
[解決済み] テンプレート駆動型とリアクティブ型の実用的な違いとは?
-
[解決済み] Angular 2におけるEventEmitter.next()とEventEmitter.emit()の相違点
-
[解決済み] ng serve がファイルの変更を自動的に検出しない
-
[解決済み] Angular 4/5/6 グローバル変数
-
[解決済み] Angular 2のFormGroupからすべての検証エラーを取得する
-
[解決済み] trackBy` と `ngFor` の使い方
-
[解決済み] ルーターナビゲートで同じページのngOnInitを呼び出さない
-
[解決済み] Angular2 bodyタグにクラスを追加する
-
[解決済み] RxJSのmap演算子でエラーを出す方法 (angular)
-
[解決済み] angular-cli server - APIリクエストを別のサーバーにプロキシする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ng buildの後にangular-cliのdist-folderのパスを変更するには?
-
[解決済み] コンポーネントクラスからテンプレート参照変数にアクセスする
-
[解決済み] 別のプロセス(id #######)が現在 ngcc を実行しています。
-
[解決済み] AngularでEventEmitterに2つのパラメータを渡すには?
-
[解決済み] 簡単なパイプで小数点以下2桁に制限する
-
[解決済み] angular4 / typescriptでdocument.getElementByIdの置き換え?
-
[解決済み] Angularで、コントロールが作成された後、FormControlにバリデータを追加する方法は?
-
[解決済み] Karma/Jasmineのテストで「[object ErrorEvent] thrown」エラーが発生した場合、どのようにデバッグすればよいですか?
-
[解決済み] 遅延のあるobservableを作成するには?
-
[解決済み] angular-cli server - APIリクエストを別のサーバーにプロキシする方法は?