【问题标题】:Angular2: how to apply two or more validators to the same control?Angular2:如何将两个或多个验证器应用于同一个控件?
【发布时间】:2017-06-11 23:00:42
【问题描述】:

我正在使用 Angular2 创建一个表单,并为电子邮件地址字段创建了两个自定义验证器。

第一个验证器检查电子邮件的有效性,第二个(异步)验证器检查电子邮件地址是否已存在于数据库中。 此外,我想添加第三个验证器以进行另一次验证。

这是我的代码:

'email': ['', [validateEmail(), thirdValidator()], asyncValidator]

我想要的行为如下: 只有当第一个验证器验证控件时,第二个验证器才应该启动。只有当第二个验证器终止时,第三个验证器才能开始其验证。

如何达到这个目标?

【问题讨论】:

    标签: validation angular angular2-forms custom-validators angular2-formbuilder


    【解决方案1】:

    Validators.compose 方法应该可以完成这项工作,例如:

       let formControls = {
            'oldPassword': new FormControl({ value: ''}),
            'newPassword': new FormControl({ value: ''}, Validators.compose([customValidator1, customValidator2]), customAsyncValidator)
        };
    

    组合验证器同时工作,这意味着我们可以同时在控件上出现多个错误(如果验证失败,每个验证器都会附加自己的错误)。如果我们一次只需要在控件上出现一个错误,我们可以通过在执行下一个验证之前检查前一个验证的状态来“链接”验证器。像这样的:

        let customValidator2 = (ctrl: FormControl): any => {
            if(ctrl.hasError('customValidationError1')) {
                // there is the error attached by customValidator1, 
                // skip executing customValidator2 (nullify its error)
                return null;
            }
    
            let isInvalid = true; // some condition...
    
            return isInvalid ? { customValidationError2: true } : null;
        }
    

    通过这种方式,我们可以例如按照优先级对验证器进行“排序”。

    【讨论】:

    • 我不知道那个方法...无论如何这似乎不是我问题的答案:Compose multiple validators into a single function that returns the union of the individual error maps. 难道不喜欢使用[validateEmail(), thirdValidator()] 吗?
    • 我已经更新了答案。验证器不按提供的顺序工作。我们可以在一个字段上出现多个错误。但是我们可以像上面的例子一样手动控制它们。
    • 好的,这对我来说很好。谢谢你。无论如何,似乎验证器按顺序在 AND 中工作。这是正确的吗?另外,你能告诉我把验证器按顺序排列和使用compose方法有什么区别吗?
    • 无论哪种方式同时工作,我认为应该没有区别,但我会检查以确保。
    • 是的,这也意味着 ctrl 没有经过验证(因为第一次验证显示错误,我们希望通过标记为有效来跳过第二次验证)。我想同样的逻辑也可以应用于异步验证器。
    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 2023-03-20
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2016-02-12
    • 1970-01-01
    相关资源
    最近更新 更多