我使用Angular Reactive Forms构建了一个简单的表单。我有一个自定义的Validator函数,它检查电话号码输入的格式。如果用户选择不输入电话号码,我想允许一个空输入,但如果他们输入电话号码,则验证他们的输入。
为此,我订阅表单控件上的值更改,并使用setValidators
方法来切换验证字段是否为空:
phoneControl.valueChanges.subscribe(() => {
if (phoneControl.value === "") {
phoneControl.setValidators(null);
} else {
phoneControl.setValidators(this.phoneValidator());
}
});
请参阅堆栈闪电战的完整代码。
代码最初工作,表单.valid
为真。当我输入一个数字时,它会打开验证,然后根据我的正则表达式成功验证它并显示错误。
但是,当我清空该字段时,错误不会消失,表单表单仍然无效,即使我的代码应将验证程序设置为 null
。您可以在上面的堆栈闪电战示例中看到这一点。
我不明白为什么会这样。有什么想法吗?
要验证电话号码输入,您可以使用@rxweb/reactive-form-validators的模式验证器。
您只需在formControl中像这样提到电话号码正则表达式:
ngOnInit() {
this.userFormGroup = this.formBuilder.group({
phoneNumber:['', RxwebValidators.pattern({expression:{'onlyPhoneNumber': /^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/} })],
});
}
对于错误消息,你可以将消息绑定到 app.component.ts 中,如下所示:
ngOnInit(){
ReactiveFormConfig.set({"validationMessage":{"onlyPhoneNumber":"Invalid phone number"}});
}
这是完整的 HTML 代码:
<div>
<form [formGroup]="userFormGroup">
<div class="form-group">
<label>Phone Number</label>
<input type="text" formControlName="phoneNumber" class="form-control" />
<small class="form-text text-danger" *ngIf="userFormGroup.controls.phoneNumber.errors">{{userFormGroup.controls.phoneNumber.errors.onlyPhoneNumber.message}}<br/></small>
</div>
<button [disabled]="!userFormGroup.valid" class="btn btn-primary">Submit</button>
</form>
</div>
下面是完整的组件代码
import { Component, OnInit } from '@angular/core';
import { FormGroup, FormBuilder } from "@angular/forms"
import { RxwebValidators } from '@rxweb/reactive-form-validators';
@Component({
selector: 'app-pattern-add-validator',
templateUrl: './pattern-add.component.html'
})
export class PatternAddValidatorComponent implements OnInit {
userFormGroup: FormGroup
constructor(
private formBuilder: FormBuilder )
{ }
ngOnInit() {
this.userFormGroup = this.formBuilder.group({
phoneNumber:['', RxwebValidators.pattern({expression:{'onlyPhoneNumber': /^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/} })],
});
}
}
工作Stackblitz
我会推荐你这样做-
if (phoneControl.value === "") {
phoneControl.clearValidators();
} else {
phoneControl.setValidators(this.phoneValidator());
}
phoneControl.updateValueAndValidity({emitEvent: false});
清除验证器比将其设置为null更好。
当动态设置验证器时,我们需要调用更新值和验证()
。还要记住添加发出事件:false
,这意味着不会触发值更改
(以防止循环)。因此,请将代码更改为:
phoneControl.valueChanges.subscribe(() => {
if (phoneControl.value === "") {
phoneControl.setValidators(null);
// or
// phoneControl.setValidators([]);
// or as mentioned by Tilak
// phoneControl.clearValidators();
} else {
phoneControl.setValidators(this.phoneValidator());
}
phoneControl.updateValueAndValidity({emitEvent: false});
});
您的StackBlitz
我正在从动态JSON值创建一个自定义的反应式表单,试图将用户在输入框中输入的字符隐藏为星号符号, 示例:假设用户正在键入“你好世界”。 预期输出:*********,当用户键入每个字符时应该会出现此输出 还将有模式验证,如仅字母和仅数字, 我已经实现了上述预期输出,但验证没有按预期工作 编码我尝试过的内容
问题内容: 我有使用验证的表单字段。问题在于,呈现表单时会立即显示错误。我只希望在用户实际在文本字段中键入或提交后才显示它。 我该如何实施? 问题答案: 仅在用户与输入交互后,使用标志显示错误: 如果仅在用户提交表单后才想触发错误,则可以使用单独的标志变量,如下所示: 然后,如果表达式内的所有JS 看上去对您来说太多了,您可以将其抽象为一个单独的方法:
本文向大家介绍jquery 表单验证之通过 class验证表单不为空,包括了jquery 表单验证之通过 class验证表单不为空的使用技巧和注意事项,需要的朋友参考一下 在开发系统时,往往都有某些表单数据为必填项,若用jQuery通过ID去验证,不仅会影响效率,还会有所遗漏,不易于后期维护。 本章将介绍如何利用jQuery,通过为表单配置class进行统一验证。(ID一个页面只可以使用一次;cl
我需要帮助理解angularjs 1.5的表单验证。 我有一个带有名字字段的表单,这是必需的。姓氏不是必需的。当我按入姓氏,然后不键入任何内容,然后按出时,我看到它显示一个红色边框。我希望有一个绿色的边界。 我有ng-有效和ng-触摸的css样式显示绿色边框和ng-无效和ng-触摸显示红色边框。如果我只是点击里面的姓氏,然后点击了出来,然后我看到的css样式为ng-无效ng-触摸显示,我看到一个红
我定义了以下验证: 它用于验证邮政编码,但当我输入字符串“K1K1A1”时,验证器说它无效。 我的正则表达式怎么了?
问题内容: 我使用并且有以下内容; 验证说,但问题是该字段是 可选的 。因此,当用户将其留空时,也会显示相同的错误消息。 因此,我想做的是仅在字段不为空时验证。如果该字段为空,则跳过该字段的验证 问题答案: 我建议您不要使用,而是使用 主要原因是我们显示了要限制用户的一组值的消息,在此情况下,您的条件消息中显示了您不想限制的值。 因此,您想限制用户输入除空格和数字之外的其他任何内容,为此输入一个正