当前位置: 首页 > 知识库问答 >
问题:

反应式表单上的角度验证应在空时打开或关闭,但在输入为空时不切换

上官淮晨
2023-03-14

我使用Angular Reactive Forms构建了一个简单的表单。我有一个自定义的Validator函数,它检查电话号码输入的格式。如果用户选择不输入电话号码,我想允许一个空输入,但如果他们输入电话号码,则验证他们的输入。

为此,我订阅表单控件上的值更改,并使用setValidators方法来切换验证字段是否为空:

phoneControl.valueChanges.subscribe(() => {
  if (phoneControl.value === "") {
    phoneControl.setValidators(null);
  } else {
    phoneControl.setValidators(this.phoneValidator());
  }
});

请参阅堆栈闪电战的完整代码。

代码最初工作,表单.valid 为真。当我输入一个数字时,它会打开验证,然后根据我的正则表达式成功验证它并显示错误。

但是,当我清空该字段时,错误不会消失,表单表单仍然无效,即使我的代码应将验证程序设置为 null。您可以在上面的堆栈闪电战示例中看到这一点。

我不明白为什么会这样。有什么想法吗?

共有3个答案

孙项禹
2023-03-14

要验证电话号码输入,您可以使用@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

班凌
2023-03-14

我会推荐你这样做-

if (phoneControl.value === "") {
        phoneControl.clearValidators();
} else {
        phoneControl.setValidators(this.phoneValidator());
}
phoneControl.updateValueAndValidity({emitEvent: false});

清除验证器比将其设置为null更好。

白嘉志
2023-03-14

当动态设置验证器时,我们需要调用更新值和验证()。还要记住添加发出事件: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”时,验证器说它无效。 我的正则表达式怎么了?

  • 问题内容: 我使用并且有以下内容; 验证说,但问题是该字段是 可选的 。因此,当用户将其留空时,也会显示相同的错误消息。 因此,我想做的是仅在字段不为空时验证。如果该字段为空,则跳过该字段的验证 问题答案: 我建议您不要使用,而是使用 主要原因是我们显示了要限制用户的一组值的消息,在此情况下,您的条件消息中显示了您不想限制的值。 因此,您想限制用户输入除空格和数字之外的其他任何内容,为此输入一个正