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

标签 javascript html angular validation angular5

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

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

如果它是数字,它应该是:

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() 保留它。

最佳答案

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

  1. Binding validationPattern variable

您的代码看起来不错,但需要进行一些小修正才能将值从 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. How can I validationType() outside of the click ?

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

例如:

在 ts 中

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

关于javascript - 如何根据下拉选择更改表单验证模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52875730/

相关文章:

html - HTML5 标记化有多少种标记类型?

angular - webpack css-loader 背景图片加载错误

javascript - 如何在循环中循环此 javascript 代码

javascript - 在javascript中将rails变量传递给ajax

javascript - skel.js 框架/HTML5UP 模板 CSS 问题

javascript - 按重量对列表进行排序,选取项目的开头并为其分配自定义权重

javascript - CSS 与 LeafLet

css - 在组件范围之外更新样式 - Angular 2

Javascript Curry 函数对这段代码有好处吗?

javascript - 当尝试访问路由参数时,我只获取其中的一部分,并且 # 之后的所有内容都被切断