【问题标题】:Angular 7 custom validation with dynamic/updated param带有动态/更新参数的 Angular 7 自定义验证
【发布时间】:2019-03-21 13:58:22
【问题描述】:

我正在使用带有材料设计组件的 Angular 7

我需要将 requireMatch 验证添加到 mat-autocomplete。

我已经使用参数创建了自定义验证,但参数值确实会动态变化。

下面是我的组件代码。

this.stepFormGroup = this.formBuilder.group({
    AccessCode: ["", [Validators.required, this.requireMatch(this.accessCodeList)]]
});

////require-match validation for access-code
requireMatch = (accessCodes: string[]) => {
    return (control: FormControl) => {
        const selection: any = control.value;
        console.log("accessCodes", accessCodes, "selection", selection);
        if (accessCodes.indexOf(selection)===-1) {
            return { requireMatch: true };
        }
        return null;
    }
}

我面临的问题是我在accessCodes 中的requireMatch 中总是变得空(init)。

this.accessCodeList 的更改不会反映给验证器。

更改this.accessCodeList 后的含义,它不会在requireMatch 验证器中获得更新的数组。

那么有人知道如何在自定义验证器中传递动态参数吗?

【问题讨论】:

  • 能否提供stackblitz/
  • 而且问题也不清楚--) 只需描述您想要什么?目前没有什么工作
  • 我认为,你需要使用,当更改“this.accessCodeList”时,this.stepFormGroup.get('AccessCode').setValidators([Validators.required, this.requireMatch(this.accessCodeList)])
  • 这是一个可行的解决方案:stackblitz.com/edit/angular-9nggzx

标签: angular angular-reactive-forms angular-validation angular-validator


【解决方案1】:

这样调用时需要绑定验证函数,否则验证器函数不会绑定输入accessList

[Validators.required, this.requireMatch(this.accessCodeList).bind(this)]

此外,如果您想限制该字段中的某些单词,您可以在此处查看我的 npm 包之一https://www.npmjs.com/package/ng4-validation

【讨论】:

  • 这提供了一种访问组件所有参数的方法。谢谢大佬!
  • 奇怪的是我传递的变量仍然为空。
【解决方案2】:

要使您的验证器功能具有控制器中的最新值, 您可以将其作为函数传递并在需要时解析。因此您的验证器函数将获得最新或当前值。

下面的代码将对我的答案提供一些见解

// Component 
this.stepFormGroup = this.formBuilder.group({
    AccessCode: ["", [Validators.required, this.requireMatch(() => this.accessCodeList)]]
});

//Validator Function
requireMatch = (getAccessCodes: (() => string[])) => {
    return (control: FormControl) => {
        const selection: any = control.value;
        const accessCodes = getAccessCodes();
        console.log("accessCodes", accessCodes, "selection", selection);
        if (accessCodes.indexOf(selection)===-1) {
            return { requireMatch: true };
        }
        return null;
    }
}

【讨论】:

    【解决方案3】:

    根据我的假设,您希望将用户输入与带有 FormControl 的字符串数组进行比较。所以你可以得到一个项目的索引,并检查它是否不等于-1,比如:

    var index = accessCodes.indexOf(selection);
    if (index != -1) { // That means item found in the array
      console.log('if')
      return { requireMatch: true };
    }
    else {
      // console.log('esle')
      return null;
    }
    

    TS 代码:

    import { Component, Inject, OnInit } from '@angular/core';
    import {
      FormBuilder,
      FormControl,
      FormGroup,
      Validators,
    } from '@angular/forms';
    
    @Component({
      selector: 'select-multiple-example',
      templateUrl: 'select-multiple-example.html',
      styleUrls: ['select-multiple-example.css'],
    })
    export class SelectMultipleExample implements OnInit {
      public stepFormGroup: FormGroup;
      accessCodeList: any[] = ['Prashant', 'Pimpale'];
    
      constructor(private fb: FormBuilder) {
    
      }
    
      public ngOnInit(): void {
        this.stepFormGroup = this.fb.group({
          AccessCode: ["", [Validators.required, this.requireMatch(this.accessCodeList)]]
        });
      }
    
      ////require-match validation for access-code
      requireMatch = (accessCodes: string[]) => {
        return (control: FormControl) => {
          const selection: any = control.value;
    
          console.log("accessCodes", accessCodes, "selection", selection);
          var index = accessCodes.indexOf(selection);
          if (index != -1) {
            console.log('if')
            return { requireMatch: true };
          }
          else {
            // console.log('else')
            return null;
          }
          return null;
        }
      }
    }
    

    HTML 代码:

    <input [formControl]="stepFormGroup.get('AccessCode')">
    

    StackBlitz

    【讨论】:

    • 我认为问题在于 Ankur 想要在创建表单后更改 accessCodeList。所以他必须使用 setValidators
    • @Eliseo 是的,可能是!问他澄清,但他没有回应
    • 是的。我知道值会在搜索时改变,因为组件是自动完成的
    • @AnkurAkvaliya 请编辑问题并说明您的要求
    猜你喜欢
    • 2016-08-13
    • 2018-04-01
    • 2018-01-27
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2020-01-26
    相关资源
    最近更新 更多