4

我正在使用带有材料设计组件的 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里面变空(init) requireMatch

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

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

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

4

3 回答 3

4

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

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

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

于 2019-03-21T14:47:20.667 回答
3

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

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

// 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;
    }
}
于 2020-01-23T12:03:45.603 回答
1

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

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

于 2019-03-21T14:17:45.240 回答