【问题标题】:Angular 2 Reactive Forms Async Custom Validation throws "subscribe not a function"Angular 2 Reactive Forms 异步自定义验证抛出“订阅不是函数”
【发布时间】:2017-06-12 20:06:46
【问题描述】:

我已经尝试了 [angular2 async validation this.subscribe exception? 答案的所有排列组合,但我仍然遇到异常。

import {AsyncValidatorFn, AbstractControl } from '@angular/forms';
export function userNameShouldBeUnique(): AsyncValidatorFn {
    return (control: AbstractControl): { [key: string]: any } => {
        return new Promise(resolve => {
            setTimeout(() => {
                if (control.value == 'mosh')
                    resolve({ shouldBeUnique: true });
                else
                    resolve(null);
            }, 1000);
        });
    }
}

并在组件中(最后一次尝试):

this.myForm = this.fb.group({
            username: [
                '',
                Validators.compose([Validators.required, forbiddenNameValidator(/bob/)]),
                Validators.composeAsync([userNameShouldBeUnique])
            ],
            password: ['', Validators.required]
        });

那我做错了什么?谢谢

【问题讨论】:

  • 导入 Rxjs/rxjs ;这可能是问题
  • 是的 - 这没有任何帮助 - 谢谢

标签: angular2-forms


【解决方案1】:

解决办法是:

import { AsyncValidatorFn, AbstractControl } from '@angular/forms';

export function UniqueValidator(): AsyncValidatorFn {
    return (control: AbstractControl): Promise<any> => {
        return new Promise<any>(resolve => {
            setTimeout(() => {
                if (control.value === 'mosh')
                    resolve({ shouldBeUnique: true });
                else
                    resolve(null);
            }, 1000);
        });
    };
};

现在您已经配置好了返回类型。作为自定义验证添加:

username: ['', Validators.required, UniqueValidator()]

刚刚测试过,它可以工作;)

【讨论】:

  • 如果要注入http怎么办
  • 在验证器中注入http?做什么的? @amrabdulaziz
  • 进行服务器端验证,例如如果电子邮件已经存在
  • 我宁愿把验证器只用逻辑,而不是用对服务器的请求。因此,我建议提供一项服务来检索现有电子邮件列表并将它们作为参数传递给验证器。然后,只需检查该数组即可。比每次输入内容时都向服务器发出许多请求要好。
  • 如果数组有 10,000 项要检查怎么办?应该在每个验证周期检查服务器端。如果我们使用 service 服务应该被注入到
猜你喜欢
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
相关资源
最近更新 更多