私は、非同期検証応答を処理するためのAngular2フォーム検証の例を更新しようとしています。こうすることで、HTTPエンドポイントでユーザー名を検証できます。Angular2 Async Form Validator(プロミスを返す)
/**主人公の名前が与えられた正規表現に一致することはできません*/
export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {
return (control: AbstractControl): {[key: string]: any} => {
const name = control.value;
const no = nameRe.test(name);
return no ? {'forbiddenName': {name}} : null;
};
}
を:彼らは現在、現在の約束を使用していないし、それがうまく働いて自分のコードを見てみると
私はPromiseを返すように更新しようとしています。何かが好きです:
/** A hero's name can't match the given regular expression */
export function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {
return (control: AbstractControl) => {
const name = control.value;
return new Promise(resolve => {
resolve({'forbiddenName': {name}});
});
};
}
しかし、私が得た結果は、エラーメッセージを表示しません、それは未定義を示しています。
onValueChanged(data?: any) {
if (!this.heroForm) { return; }
const form = this.heroForm;
for (const field in this.formErrors) {
// clear previous error message (if any)
this.formErrors[field] = '';
const control = form.get(field);
if (control && control.dirty && !control.valid) {
const messages = this.validationMessages[field];
for (const key in control.errors) {
this.formErrors[field] += messages[key] + ' ';
}
}
}
}
は、しかし、私はこれを行うための良い方法のわからない:
私の考えは、それは彼らがエラーを表示し処理している方法とは何かを持っています。
Angular2例:約束を返そうと私の例に https://angular.io/docs/ts/latest/cookbook/form-validation.html#!#live-example
ありがとうございました!バリデータを独自の配列に入れましたが、ハードエラーは受け付けませんでしたが、バリデーションメッセージが表示されません。更新されたPLNKRを使用して、すべてのことがきれいに見えますか? https://plnkr.co/edit/sDs9pNQ1Bs2knp6tasgI?p=preview – aherrick
'onValueChanged(data ?: any)'がここでの問題です。このコードでは、メソッドはエラー出力の作成を担当し、フォームの値が変更されるとすぐにトリガーされ、同期バリデーターはそれまでに実行され、非同期バリデータは実行されませんでした。これは、メソッドが非同期検証のエラー結果を表示しない理由です。この例でエラー出力がどのようにビルドされるかは、単純に非同期検証には適していません。 FormControlという名前のエラーオブジェクトをHTMLに出力すると、エラーが表示されます。 ( '{{heroForm.get( 'name')。errors | json}}') –
ありがとうございました。どのように変更することをお勧めしますか? – aherrick