angular - 在 Angular 2 中异步验证表单字段(在 HTTP 请求之后)

标签 angular typescript formbuilder customvalidator

想法是让用户 POST 表单。如果用户已经注册,则触发 API 返回的错误以将电子邮件字段设置为错误。

我将响应式表单与 FormBuilder 结合使用,并尝试在订阅错误捕获器中调用验证器:

构造函数:

this.email = fb.control('', [Validators.required, Validators.pattern(/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/), SignupComponent.alreadyExist()]);
this.username = fb.control('', [Validators.required, Validators.pattern(/^([A-ZÀ-ÿa-z0-9]{2,})+(?:[ _-][A-ZÀ-ÿa-z0-9]+)*$/)]);

this.userRegisterForm = fb.group({
    email: this.email,
    username: this.username
});

自定义 alreadyExist() 验证器:

static alreadyExist(alreadyExist: boolean = false): any {

    return (control: FormControl): { [s: string]: boolean } => {

        if(alreadyExist) {
            return { emailAlreadyExist: true }
        }
    }
}

提交():

this.user.create(newUser)
    .subscribe(
        data => {
            this.router.navigate(['signin']);
        },
        error => {
            if(error.status === 401) {

                // CALL THE VALIDATOR HERE TO SET : FALSE
                SignupComponent.alreadyExist(true);
            }

            this.loading = false;
        });

似乎调用了验证器,但从未调用过其中返回的匿名方法...也许这不是一个好习惯,有人可以强调我吗?谢谢

最佳答案

好的,我找到了一个很好的解决方案。

在我的例子中,对于电子邮件 FormControl,我不需要自定义的 validator(即使可以使用 setValidators())。

我可以删除 alreadyExist() 并从验证器列表中删除它的声明。

然后,我使用 FormControl 上可用的 setErrors() 方法:

onSubmit() :

this.user.create(newUser)
    .subscribe(
        data => {
            this.router.navigate(['signin']);
        },
        error => {
            if(error.status === 401) {

                // CALL THE VALIDATOR HERE TO SET : FALSE
                this.userRegisterForm.controls['email'].setErrors({
                  "emailAlreadyExist": true
                });
            }

            this.loading = false;
        });

电子邮件 FormControl 有一个新的错误,因此,通过这种方式我可以为这个错误附加一条错误消息。

关于angular - 在 Angular 2 中异步验证表单字段(在 HTTP 请求之后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41881263/

相关文章:

reactjs - 如何使用react onchange动态处理复选框更改

Symfony - 如何以 "many-to-one"形式保存外键

javascript - 打开 GoogleMaps 应用程序,以便从网站在 Android 上进行导航

html - 我们可以从 Angular 应用程序中排除 tsconfig.spec.json

angular - 如何使用authguard中的角色来保护路由?

typescript - 如何使用 [key : string]: any 从 Typescript 类型中删除字段

angular - 找不到模块 "ionic-native"

forms - 如何使用从 form.io 的表单生成器中的 api 获取的值加载数据网格组件?

仅使用年份选择器输入Symfony 2日期

javascript - Angular 2、动态绑定(bind)属性名