【问题标题】:Angular2 Async Form Validator (return Promise)Angular2 异步表单验证器(返回 Promise)
【发布时间】:2017-04-12 20:24:33
【问题描述】:

我正在尝试更新 Angular2 表单验证示例以处理异步验证响应。这样我就可以点击 HTTP 端点来验证用户名。

看看他们目前没有使用 Promise 的代码,它工作得很好:

/** 英雄的名字不能匹配给定的正则表达式 */

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

链接到我试图返回 Promise 的示例: https://plnkr.co/edit/sDs9pNQ1Bs2knp6tasgI?p=preview

【问题讨论】:

    标签: validation angular angular2-forms


    【解决方案1】:

    问题在于您将 AsyncValidator 添加到 SyncValidator 数组中。 AsyncValidators 被添加到 SyncValidators 之后的单独数组中:

    this.heroForm = this.fb.group({
      'name': [this.hero.name, [
          Validators.required,
          Validators.minLength(4),
          Validators.maxLength(24)
        ], 
        [forbiddenNameValidator(/bob/i)] // << separate array
      ],
      'alterEgo': [this.hero.alterEgo],
      'power':    [this.hero.power, Validators.required]
    });
    

    【讨论】:

    • 感谢您的评论!我已将验证器放在自己的数组中,没有收到硬错误,但没有看到验证消息显示。更新的 PLNKR 看起来一切正常吗? plnkr.co/edit/sDs9pNQ1Bs2knp6tasgI?p=preview
    • onValueChanged(data?: any) 是这里的问题。在此代码中,该方法负责构建错误输出,并在表单的值更改时立即触发,同步验证器运行,异步验证器没有。这就是为什么该方法看不到异步验证的错误结果的原因。此示例中错误输出的构建方式根本不适合异步验证。如果您将名称 FormControl 的错误对象打印到 HTML,您将看到错误存在。 ({{heroForm.get('name').errors | json}})
    • 谢谢。您如何建议更改它?寻找一种“通用”的方式来处理错误打印
    • 我试图避免在 HTML 中为每个 for 元素添加多个 div/error 条目
    • 简单的解决方案是在 FormControl 的 .statusChanges Observable 上触发 onValueChanged(data?: any) 而不是 .valueChanges Observable。也许您还应该为status === "INVALID" 使用.filter(),然后它只会在实际存在错误对象时被触发。
    猜你喜欢
    • 2016-07-26
    • 2018-04-16
    • 2021-04-25
    • 2021-11-26
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2017-10-23
    相关资源
    最近更新 更多