Angular2 forms Angular 2反应式表单异步自定义验证抛出“订阅非函数”

Angular2 forms Angular 2反应式表单异步自定义验证抛出“订阅非函数”,angular2-forms,Angular2 Forms,我已经尝试了答案的每一种排列,但我仍然得到了例外 import {AsyncValidatorFn, AbstractControl } from '@angular/forms'; export function userNameShouldBeUnique(): AsyncValidatorFn { return (control: AbstractControl): { [key: string]: any } => { return new Promise(

我已经尝试了答案的每一种排列,但我仍然得到了例外

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]
        });
那么我做错了什么呢?谢谢,解决方案是:

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);
        });
    };
};

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

导入Rxjs/Rxjs;这可能是一个问题啊-这没有任何帮助-谢谢如果你想在验证器中注入httpinject http呢?为什么?@amrabdulazizmake服务器端验证,例如,如果电子邮件已经存在,我宁愿让验证器只使用逻辑,而不是对服务器的请求。所以我建议最好有一个服务来检索现有电子邮件的列表,并将它们作为param传递给验证器。然后,只需签入该数组。这比每次键入内容时向服务器发出许多请求要好。如果数组有10000个项目要检查怎么办?每个验证周期都应该在服务器端检查它。如果我们使用应该注入服务的服务
username: ['', Validators.required, UniqueValidator()]