Angular4 中的自定义验证

Posted

技术标签:

【中文标题】Angular4 中的自定义验证【英文标题】:Custom validation in Angular4 【发布时间】:2018-07-29 18:52:21 【问题描述】:

在我的页面中,我有一个简单的表单组。我必须在其中为名称编写自定义验证。

this.searchForm = this._formBuilder.group(

        profileName: new FormControl('', Validators.compose([Validators.required])),
        TypeId: new FormControl('', Validators.compose([Validators.required])),
        tempRange: new FormControl('', Validators.compose([Validators.required])),
        region: new FormControl('', Validators.compose([Validators.required])),
        quarter1: new FormControl('', Validators.compose([Validators.required])),
        quarter2: new FormControl('', Validators.compose([Validators.required]))

    , 
            validator: this.customValidator// your validation method
        );

我已将自定义验证放入方法 this.customValidator 中。

我的一项验证是检查 profileName 的重复检查。

我在从验证方法获取同一类型脚本类中的其他方法(验证逻辑所在的位置)时遇到问题,当我调用该方法(不是静态或函数)时,我收到错误消息(按 f12)

ERROR 错误:未捕获(承诺):TypeError: this.validateProfileName 不是函数...'。

有什么方法可以调用特定的方法,或者我需要在它自己的验证方法中实现所有逻辑。

另外,如何以与必填字段验证错误消息相同的样式显示验证错误消息。

我的验证方法

customValidator(control: AbstractControl) 
    debugger;
    let profileName = control.get('profileName').value;
    let retgionCode = control.get('regionCode').value;
    let forcastType = control.get('forecastTypeId');
    var status = this.validateProfileName(retgionCode, profileName);

    if (!status)
    control.get("profileName").setErrors( 'invalidProfileName': true );

    return null;

【问题讨论】:

如果您不向我们展示您的代码,没有人会知道您的代码中的错误是什么;) 我已经添加了方法和确切的错误。谢谢 【参考方案1】:

问题在于this。正如您现在所拥有的那样,您正在失去this 的范围。在您的自定义验证器中,this 不是指向您的组件范围,而是指向函数范围。并且函数范围内没有validateProfileName,因此 Angular 会给出正确的错误。

要保留this 的上下文,绑定它:

validator: this.customValidator.bind(this)

现在您可以访问自定义验证器之外的范围。

【讨论】:

您好,感谢您的评论,请确认我需要在哪里调用绑定?我打电话给验证器的地方是同一个地方吗?【参考方案2】:

看起来你做的工作比你需要做的多,而且你没有在自定义验证器中调用函数。这就是你想要的:

this.searchForm = this._formBuilder.group(
    profileName: ['', Validators.required],
    TypeId: ['', Validators.required],
    tempRange: ['', Validators.required],
    region: ['', Validators.required],
    quarter1: ['', Validators.required],
    quarter2: ['', Validators.required]
,  validator: this.customValidator() );

然后在你的验证函数中,你需要这样做:

customValidator() 
    debugger;
    let profileName = this.searchForm.get('profileName').value;
    let retgionCode = this.searchForm.get('regionCode').value;
    let forcastType = this.searchForm.get('forecastTypeId');
    let status = this.validateProfileName(retgionCode, profileName);

    if (!status) 
        this.searchForm.get("profileName").setErrors( 'invalidProfileName': true );
        return null;
    

【讨论】:

感谢您的评论,但我无法按照您的建议调用验证方法,我已经更新了我的帖子,也添加了验证方法。在其中我必须提供一个参数抽象控制,并且即使在调用中没有“()”,该方法也会命中。 如果你调用一个需要参数的函数,但你没有提供一个参数,你将在 100% 的情况下抛出错误。当然你可以在没有 () 的情况下调用你的函数,但在这种情况下你需要,但是你的函数需要一个 AbstractControl。 如果我注释掉“var status = this.validateProfileName(retgionCode, profileName);”从该方法来看,调试器没有任何错误,我正在从调用验证的地方获取特定的 AbstractControl。我也在调试时获得了配置文件名称和区域代码。 控件将是未定义的,除非您将某些内容传递给 customValidation 函数。您的代码不完整。我会根据你的需要更新我的帖子。

以上是关于Angular4 中的自定义验证的主要内容,如果未能解决你的问题,请参考以下文章

模板中的自定义表单验证错误

Laravel Spark 中的自定义验证消息

Angular 4 - 验证器自定义函数这是未定义的

Worklight 混合应用程序中的自定义证书验证

将预定义的验证器添加到 Angular 中的自定义组件

Laravel 5 中的自定义验证器