【问题标题】:How can I change form validation pattern based on dropdown selection?如何根据下拉选择更改表单验证模式?
【发布时间】:2018-10-18 13:58:08
【问题描述】:

我正在为我们的一个项目在 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 是一个实际选择字段的函数; validationType 是我试图用来为输入创建验证模式的内容:

<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()。

【问题讨论】:

标签: javascript html angular validation angular5


【解决方案1】:

你的两个问题都是有效的 -

  1. 绑定validationPattern变量

您的代码看起来不错,但是需要稍作修正才能将值从 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. 如何在点击之外进行validationType()?

是的,在click 中调用多个函数不是好的做法,但它不会影响执行。在您的情况下,您已经在调用一个函数setField。您可以利用此功能,您可以在 validationType 内使用 setField

例如:

在ts中

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

【讨论】:

    【解决方案2】:

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

    [pattern]="validationPattern"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多