如何根据下拉选择更改表单验证模式?
How can I change form validation pattern based on dropdown selection?
我正在 UI 中为我们的一个项目设置表单验证。其中一个文本框需要根据上一个下拉列表的 selection 进行不同的验证 pattern
。例如,如果下拉列表 selection 是 name
,则模式应为:
pattern='[a-zA-Z ]+'
好像是number
,应该是:
pattern='[0-9 ]+`
我在组件中设置了一个函数来根据 selection:
设置验证字符串
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">
到目前为止我有两个问题:
如何正确地将 validationPattern 变量的值或 validationType() 函数的输出传递给输入中的模式?截至目前,它似乎正在阅读 this.validationPattern
作为实际模式 - 即 this.validationPattern
一词而不是关联值。不管我select姓名还是号码,我输入的任何内容都是无效的。
如何在点击之外使用 validationType()?有人告诉我,将多个函数关联到一个(单击)是非常糟糕的做法,在这种特殊情况下,它应该保留给 setField()。
要将 pattern
属性 绑定到 validationPattern
,请使用 property binding:
[pattern]="validationPattern"
至于在一个事件处理程序中调用两个函数,我不认为这是一种不好的做法,尤其是对于触发频率不高的按钮单击事件。
你的两个问题都是有效的 -
- 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">
- How can I validationType() outside of the click ?
是的,在 click
中调用多个函数不是好的做法,但是它不会影响执行。在您的情况下,您已经在调用一个函数 setField
。您可以利用此功能 validationType
inside setField
.
例如:
在 ts
setField(selected){
this.validationType(selected);
}
我正在 UI 中为我们的一个项目设置表单验证。其中一个文本框需要根据上一个下拉列表的 selection 进行不同的验证 pattern
。例如,如果下拉列表 selection 是 name
,则模式应为:
pattern='[a-zA-Z ]+'
好像是number
,应该是:
pattern='[0-9 ]+`
我在组件中设置了一个函数来根据 selection:
设置验证字符串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">
到目前为止我有两个问题:
如何正确地将 validationPattern 变量的值或 validationType() 函数的输出传递给输入中的模式?截至目前,它似乎正在阅读
this.validationPattern
作为实际模式 - 即this.validationPattern
一词而不是关联值。不管我select姓名还是号码,我输入的任何内容都是无效的。如何在点击之外使用 validationType()?有人告诉我,将多个函数关联到一个(单击)是非常糟糕的做法,在这种特殊情况下,它应该保留给 setField()。
要将 pattern
属性 绑定到 validationPattern
,请使用 property binding:
[pattern]="validationPattern"
至于在一个事件处理程序中调用两个函数,我不认为这是一种不好的做法,尤其是对于触发频率不高的按钮单击事件。
你的两个问题都是有效的 -
- 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">
- How can I validationType() outside of the click ?
是的,在 click
中调用多个函数不是好的做法,但是它不会影响执行。在您的情况下,您已经在调用一个函数 setField
。您可以利用此功能 validationType
inside setField
.
例如:
在 ts
setField(selected){
this.validationType(selected);
}