【问题标题】:Angular and async custom validationAngular 和异步自定义验证
【发布时间】:2021-04-29 23:39:35
【问题描述】:

如果用户名已被占用,我需要签入我的应用并与我的后端核实。为了使这尽可能简单,而不是在输入控件上执行模糊函数调用,我选择使用异步自定义验证器。

我的验证器看起来像这样。

export function userNameValidator(userservice: UserService): AsyncValidatorFn  {
    return (control: AbstractControl) => {
        return userservice.validateUsername(control.value.toLowerCase())
            .pipe(
                tap(result => console.log(result)),
                // tslint:disable-next-line: semicolon
                // tslint:disable-next-line: arrow-return-shorthand
                map(result => {  return result; })
            );};}

返回的结果如下所示{username_avail: true}

这是我注册自定义异步验证器的方式

  form = this.fb.group({
    username: ['', {
        validators: [
            Validators.required,
            Validators.minLength(5),
            Validators.maxLength(20)
        ],
        asyncValidators: [userNameValidator(this.userservice)],
        updateOn: 'blur'
    }]});

我可以看到我的系统点击了验证器并进行了后端调用,但由于某种原因我无法让它工作。有没有办法告诉系统什么是有效响应或者它总是必须为空?

【问题讨论】:

    标签: angular


    【解决方案1】:

    你一直在返回对象。

    要使其正常工作,您需要在出错时返回带有键的对象,或者在一切正常时返回 null

     map(result => {  return result.success ? {invalidUsername: {value: control.value}} : null; })
    

    注意我不知道结果是什么,所以result.success应该改成。

    【讨论】:

    • 谢谢,基本上当我的自定义验证器验证并通过时,我应该返回一个 null
    • @SamS87 只有在值有效时才应返回 null :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2023-03-12
    • 2017-11-30
    • 2019-11-09
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多