答えて
私は同じ問題に会ったし、すべての検証エラーを発見し、それらを表示するために、私は次の方法を書いた:
getFormValidationErrors() {
Object.keys(this.productForm.controls).forEach(key => {
const controlErrors: ValidationErrors = this.productForm.get(key).errors;
if (controlErrors != null) {
Object.keys(controlErrors).forEach(keyError => {
console.log('Key control: ' + key + ', keyError: ' + keyError + ', err value: ', controlErrors[keyError]);
});
}
});
}
フォーム名productForm
があなたに変更する必要があります。
これは次のように機能します:私たちはすべてのコントロールを書式{[p: string]: AbstractControl}
の形式から取得し、エラーの詳細については各エラーキーごとに繰り返します。 null
のエラー値はスキップされます。
テンプレートビューで検証エラーを表示するために変更することもできます。ちょうどconsole.log(..)
を必要なものに置き換えてください。
this.form.errorsプロパティを反復処理できます。
'' 'this.form.errors'''は、' '' this.form.controls''ではなく、 '' this.form'''の検証エラーだけを返します。 FormGroupsとその子(FormGroups、FormControls、FormArraysの任意の数)を別々に検証することができます。すべてのエラーを取得するには、再帰的にそれらに尋ねる必要があると思います。 –
export class GenericValidator {
constructor(private validationMessages: { [key: string]: { [key: string]: string } }) {
}
processMessages(container: FormGroup): { [key: string]: string } {
const messages = {};
for (const controlKey in container.controls) {
if (container.controls.hasOwnProperty(controlKey)) {
const c = container.controls[controlKey];
if (c instanceof FormGroup) {
const childMessages = this.processMessages(c);
// handling formGroup errors messages
const formGroupErrors = {};
if (this.validationMessages[controlKey]) {
formGroupErrors[controlKey] = '';
if (c.errors) {
Object.keys(c.errors).map((messageKey) => {
if (this.validationMessages[controlKey][messageKey]) {
formGroupErrors[controlKey] += this.validationMessages[controlKey][messageKey] + ' ';
}
})
}
}
Object.assign(messages, childMessages, formGroupErrors);
} else {
// handling control fields errors messages
if (this.validationMessages[controlKey]) {
messages[controlKey] = '';
if ((c.dirty || c.touched) && c.errors) {
Object.keys(c.errors).map((messageKey) => {
if (this.validationMessages[controlKey][messageKey]) {
messages[controlKey] += this.validationMessages[controlKey][messageKey] + ' ';
}
})
}
}
}
}
}
return messages;
}
}
私はDeborahkから取り出して少し修正しました。
これがサポートする内部FormGroup
(like here)
とソリューションです:アンギュラ4.3.6
import { AbstractControl, FormGroup, ValidationErrors } from '@angular/forms';
export interface AllValidationErrors {
control_name: string;
error_name: string;
error_value: any;
}
export interface FormGroupControls {
[key: string]: AbstractControl;
}
export function getFormValidationErrors(controls: FormGroupControls): AllValidationErrors[] {
let errors: AllValidationErrors[] = [];
Object.keys(controls).forEach(key => {
const control = controls[ key ];
if (control instanceof FormGroup) {
errors = errors.concat(getFormValidationErrors(control.controls));
}
const controlErrors: ValidationErrors = controls[ key ].errors;
if (controlErrors !== null) {
Object.keys(controlErrors).forEach(keyError => {
errors.push({
control_name: key,
error_name: keyError,
error_value: controlErrors[ keyError ]
});
});
}
});
return errors;
}
を-フォームバリデーション - errors.ts取得例を使用して:
if (!this.formValid()) {
const error: AllValidationErrors = getFormValidationErrors(this.regForm.controls).shift();
if (error) {
let text;
switch (error.error_name) {
case 'required': text = `${error.control_name} is required!`; break;
case 'pattern': text = `${error.control_name} has wrong pattern!`; break;
case 'email': text = `${error.control_name} has wrong email format!`; break;
case 'minlength': text = `${error.control_name} has wrong length! Required length: ${error.error_value.requiredLength}`; break;
case 'areEqual': text = `${error.control_name} must be equal!`; break;
default: text = `${error.control_name}: ${error.error_name}: ${error.error_value}`;
}
this.error = text;
}
return;
}
ありがとう!これはまさに私が探していた解決策です。 –
完璧に動作します:)ありがとう! +1 –
それとも、ただそれからちょうどすべてのあなたのエラー
const errorsFlat = SuperForm.getAllErrorsFlat(fg);
console.log(errors);
// IF not populated correctly - you could get aggregated FormGroup errors object
let getErrors = (formGroup: FormGroup, errors: any = {}) {
Object.keys(formGroup.controls).forEach(field => {
const control = formGroup.get(field);
if (control instanceof FormControl) {
errors[field] = control.errors;
} else if (control instanceof FormGroup) {
errors[field] = this.getErrors(control);
}
});
return errors;
}
// Calling it:
let formErrors = getErrors(this.form);
をフェッチするためにFormGroupを渡す
npm install --save angular-super-validator
にも深いとダイナミックなフォームから、すべてのエラーを取得するには、このライブラリを使用することができます私はangle 5を使用しています。FormGroupを使用してフォームのステータスプロパティを確認するだけで済みます。
this.form = new FormGroup({
firstName: new FormControl('', [Validators.required, validateName]),
lastName: new FormControl('', [Validators.required, validateName]),
email: new FormControl('', [Validators.required, validateEmail]),
dob: new FormControl('', [Validators.required, validateDate])
});
すべてのフィールドがすべての検証ルールを通過しない限り、this.form.statusは "INVALID"になります。
リアルタイムの変化を検出するのが最も重要な部分です。
はい、フォームグループ全体のエラーを取得する必要があります。 –
- 1. 角度2タグの検証は次のコードを考える
- 2. 角度2 - 角度2つのテンプレート駆動型の形態ではformGroup
- 3. Angular4:このコードを考えるとngFor
- 4. 角度2のformGroupにデータをバインドする方法
- 5. 角度2 router.navigateは、アプリモジュールを考えると、ネストされたjsの機能
- 6. 角度2ページには、問題を考え出した配列
- 7. 角度:どのようにこのような単純な角度のモジュールを考えると、コントローラ
- 8. formGroupはFormGroupインスタンスを期待しています:角度4
- 9. 角度2+:必要なバリデータは、このような反応性の角の形を考える
- 10. 角度2のバインドされていないフィールドformGroup
- 11. コンパイルC++コードにこのコードを考えるとブーストのregex_match
- 12. は、このコードを考える
- 13. ホームボタン見える角度2
- 14. 角度4 FormBuilder、FormGroup with Dynamic FormControls
- 15. 角度2 - フォームグループコンポーネント
- 16. 角度2アプリケーションのうち移動config.jsonと角2コード
- 17. 角2 - FormGroup ValueChanges購読中止
- 18. jChart2D - 次のコードを考えるとTracePoint2D
- 19. は、このコードを考えると型クラス
- 20. このコードを考えると修飾子
- 21. ラケット変数メモリにこのコードを考えると
- 22. このコードを考えると、私はちょうどLaravelストレージ
- 23. 角度2と2
- 24. 角度2 RC-4フォーム、タイプ 'FormGroup'は 'typeof FormGroup'タイプに割り当てられません
- 25. のNode.js:コードの一部は、このコードを考えると別の
- 26. 角度2のフォームRC4
- 27. ログインガードを備えた角度2のルータ
- 28. 角度2 ngClassは、このコードを持つアニメーション
- 29. 複数のフィルタの角度2のコード
- 30. 角度4つの形でformGroupの宣言を理解
同じパターンでFormArrayの上記のメソッドを拡張するには? –