如何根据下拉选择更改表单验证模式?

时间:2018-10-18 13:58:09

标签: javascript html angular validation angular5

我正在UI中为我们的一个项目设置表单验证。根据上一个下拉列表的选择,其中一个文本框需要具有不同的验证pattern。例如,如果下拉选择为name,则模式应为:

pattern='[a-zA-Z ]+'

好像是number,应该是:

pattern='[0-9 ]+`

我已经在组件中设置了一个函数,以基于该选择设置验证字符串:

fields: string[] = [];
validationPattern: string;

private validationType(field: string[]) {
    if (field.includes('number')) {
        this.validationPattern = '[0-9]+';
        return this.validationPattern;
    } else if (field.includes('name')) {
        this.validationPattern = '[a-zA-Z1-9][a-zA-Z0-9 ]+';
        return this.validationPattern;
    }
}

在HTML中,我有以下内容。 setField是实际选择字段的函数; validateType是我用来为输入创建验证模式的内容:

<div ngbDropdownMenu>
    <button
        *ngFor="let selected of fields"
         class="dropdown-item"
         (click)="setField(selected); validationType(selected)">
         {{ selected }}
    </button>
</div>

这是表单验证所在的输入:

<input
    type="text"
    id="value"
    name="value"
    placeholder="Value"
    #value1="ngModel"
    pattern=this.validationPattern
    [(ngModel)]="profile.value">

到目前为止,我有两个问题:

  1. 如何正确地将validationPattern变量的值或validationType()函数的输出传递给输入中的模式?截至目前,它似乎正在将this.validationPattern作为实际模式读取-即,单词this.validationPattern而不是关联的值。无论选择名称还是数字,输入的内容都是无效的。

  2. 如何在点击之外使用validationType()?有人告诉我,与一个(单击)关联多个功能是非常不好的做法,在这种情况下,应该为setField()保留它。

2 个答案:

答案 0 :(得分:1)

您的两个问题都有效-

  
      
  1. 绑定validationPattern变量
  2.   

您的代码看起来不错,但是需要进行一些小的修改才能将ts文件中的值转换为html。截至目前,您尚未使用括号[],因此无论传递什么,它将作为字符串值。如果要获取一些动态值,则必须使用方括号。

 <input
    type="text"
    id="value"
    name="value"
    placeholder="Value"
    #value1="ngModel"
    [pattern]="validationPattern"  <!-- Get the dynamic value of validationPattern
    [(ngModel)]="profile.value">
  
      
  1. 如何在点击之外进行validateType()?
  2.   

好的,在click中调用多个函数不是一个好习惯,但是它不会影响执行。就您而言,您已经在调用一个函数setField。您可以利用validationType内的setField来利用此功能。

例如:

以ts

setField(selected){
    this.validationType(selected);
}

答案 1 :(得分:0)

要将pattern属性绑定到validationPattern,请使用property binding

[pattern]="validationPattern"

至于在一个事件处理程序中调用两个函数,我不认为这是一种不好的做法,尤其是对于按钮触发事件,它触发得不太频繁。