angular - 验证器函数未在表单控件上设置错误对象的问题

标签 angular rxjs angular2-forms rxjs5

我对以下验证器函数有疑问:

export function validateEmailKnownFactory(userAccountService: UserAccountService): {[key: string]: any} {
  return (control: AbstractControl) => {
    return control
      .valueChanges
      .debounceTime(1000)
      .switchMap(value => userAccountService.checkAvailability(value))
      .map(res => {
        if (res.json() === false) {
          return null;
        }
        //Control flow does get through here
        return {emailKnownValidator: {unknown: true}};
      });
  };
}

它没有在表单控件上设置错误对象(即{emailKnownValidator: {unknown: true}}),但控制流确实通过了正确的位置。

现在,如果我用以下函数替换上面的函数:

export function validateEmailKnownFactory(userAccountService: UserAccountService): {[key: string]: any} {
  return (control: AbstractControl) => {
    return userAccountService.checkAvailability(control.value)
      .map(res => {
        if (res.json() === false) {
          return null;
        }
        return {emailKnownValidator: {unknown: true}};
      });
  };
}

错误对象在表单控件上设置得很好,并且应用程序的行为符合预期。

注意区别:我从 control.valueChanges 获取 Observable,并对其调用 debounceTime,而其他函数只调用 直接检查可用性

为了完整起见,这里是 checkAvailability 方法:

  checkAvailability(email: string) {
    let body = 'email=' + email;
    return this.http.get(this.urls.USER_ACCOUNT.EMAIL_AVAILABLE + body);
  }

最佳答案

Angular 2 中的异步验证器函数可以返回 PromiseObservable。如果返回一个 Observable,它必须完成 - 如 Angular converts the Observable to a Promise 。也就是说,使用 Observable 是为了异步验证 - 而不是验证器可以提供结果流。

第一个验证器中由 valueChanges 组成的 Observable 未完成 - 因为 valueChanges 不断产生更改。这意味着 Promise 无法解析,并且没有可应用于控件的验证结果。 (请注意,Angular 将为控件值的每次更改调用验证函数,并且每次调用都会看到一个组合并订阅的 Observable,因此将调用 checkAvailability对于每次更改。debounceTime 运算符不会影响您似乎想要的行为。)

checkAvailability 函数返回的 Observable 确实完成,因此您的第二个验证器函数可以工作。

关于angular - 验证器函数未在表单控件上设置错误对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39230526/

相关文章:

javascript - 如何链接 RXJS 中的 promise 列表?

javascript - 如何使用模型驱动/ react 形式修改指令中的输入值

javascript - 绑定(bind)到 ngFor 内的对象数组,将所有输入绑定(bind)在一起

angular - 如何在 ng select 中搜索值?

android - 找不到与给定名称匹配的资源 : attr ‘android:keyboardNavigationCluster’

html - Angular 4 下拉菜单无法使用动画

javascript - Angular 初学者错误 : tsc is not a recognized as an internal or external command. ..(Webstorm

Rxjs - 如何在通知 UI 错误的同时重试错误的可观察对象

javascript - 如何中止@cycle/http 驱动程序发出的调用?

angular - 要求选中一个复选框