如何在Angular 7中使用反应形式设置“至少应填写一个字段”验证?

阿努巴·古普塔(Anubha Gupta)

我在Angular 7中有一个反应形式,其中有三个字段,电子邮件,电话和寻呼机。我的要求是,至少应由用户填写其中之一,否则我们将引发类似“请指定通知之一(电子邮件,SMS或寻呼机)”的错误。

我尝试编写自定义通知,但无法正常工作。您能帮我解决我哪里出问题了。

以下是我的HTML代码:

<form class="form-horizontal" [formGroup]="editorForm">
  <div class="form-group" required>
      <label for="emailAdressInput">Email Addresses</label>
      <input type="text" id="emailAdressInput" formControlName="emailAdresses">
  </div>

<div class="form-group" required>
      <label for="phoneNumberInput">Email Addresses</label>
      <input type="text" id="phoneNumberInput" formControlName="phoneNumber">
  </div>

<div class="form-group" required>
      <label for="pagerNumberInput">Email Addresses</label>
      <input type="text" id="pagerNumberInput" formControlName="pagerNumber">
</div>
</form>

以下是component.ts代码:

this.editorForm = this._formBuilder.group({
          displayLabel: ['', Validators.required],
          emailAdresses: [''],
          phoneNumber: [''],
          notification: this._formBuilder.group({
            pagerNumber: [''],
            phoneNumber: [''],
            emailAdresses: ['']
          }, this.atLeastOneValidator()),
          pagerNumber: [''],
       });

       public atLeastOneValidator = () => {
         return (controlGroup) => {
           let controls = controlGroup.controls;
            if ( controls ) {
                let theOne = Object.keys(controls).find(key=> controls[key].value!=='');
               if ( !theOne ) {
                return {
                    atLeastOneRequired : {
                        text : 'At least one should be selected'
                    }
                }
            }
        }
        return null;
    };
};
Ankit prajapati

我已经在stackblitz中解决了它:https ://stackblitz.com/edit/angular-j3i4yg

export class AppComponent {
  name = 'Angular';

  editorForm: FormGroup;
  // _formBuilder: FormBuilder = new FormBuilder();
  constructor(private _formBuilder: FormBuilder) {

    this.editorForm = this._formBuilder.group({
      displayLabel: ['', Validators.required],
      emailAdresses: [''],
      phoneNumber: [''],
      notification: this._formBuilder.group({
        pagerNumber: [''],
        phoneNumber: [''],
        emailAdresses: ['']
      }, { validators: this.atLeastOneValidator }),
      pagerNumber: [''],
    });
  }

  public atLeastOneValidator: ValidatorFn = (control: FormGroup): ValidationErrors | null => {

    let controls = control.controls;
    console.log(controls);
    if (controls) {
      let theOne = Object.keys(controls).findIndex(key => controls[key].value !== '');
      if (theOne === -1) {
        console.log(theOne);
        return {
          atLeastOneRequired: {
            text: 'At least one should be selected'
          }
        }
      }
    };

  }
}

范本:

<form class="form-horizontal" [formGroup]="editorForm">
  <fieldset formGroupName="notification">
  <div class="form-group" required>
      <label for="emailAdressInput">Email Addresses</label>
      <input type="text" id="emailAdressInput" formControlName="emailAdresses">
  </div>

<div class="form-group" required>
      <label for="phoneNumberInput">Email Addresses</label>
      <input type="text" id="phoneNumberInput" formControlName="phoneNumber">
  </div>

<div class="form-group" required>
      <label for="pagerNumberInput">Email Addresses</label>
      <input type="text" id="pagerNumberInput" formControlName="pagerNumber">
</div>
  </fieldset>

{{editorForm.get('notification')?.errors| json}}
<br>
<br>
<span *ngIf="editorForm.get('notification')?.errors?.atLeastOneRequired"> {{editorForm.get('notification')?.errors?.atLeastOneRequired.text}}</span>

</form>

检查并让我知道是否有任何疑问。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Ruby on Rails中验证表单中至少一个字段的存在

Angular,如何为两个字段中的任何一个设置验证应以反应形式方法验证

至少一个字段的格式是必填项:Angular中的表单验证

如何在Rails验证中使用另一个字段

如何在反应中根据另一个字段更新一个字段?

如何在访问中创建一个字段,该字段在填写表单的其余部分时更新

如果用户在jsp中填写一个字段(使用spring mvc和hibernate时),我如何自动填写其他表单字段

如何指定总共三个字段中至少需要一个字段?

如何检查该值至少等于列表中的一个字段?

如何确保至少一个字段在Serializer中不为空?

如何在Firestore中使用POJO更新所有文档中的一个字段?

如何在节点grpc中设置一个字段

如何在另一个字段的计算中使用别名

如何在Kendo树列表的一个字段中使用多个按钮?

Angular 2+自定义验证器“是否需要”填写另一个字段

如何验证电子邮件ID和密码,密码应包含小写,大写和至少一个字符,并且两个字段都应为内联?

如何在 Django 的模型中通过另一个字段验证一个字段?

如何在访问中将表中的一个字段设置为等于表中的另一个字段

如何从查询中的一个字段获取信息以在另一个查询中使用?

如何在formik中基于另一个字段设置一个字段的输入值?

如何在Solr中使用另一个字段中一个字段的数据?

如何在 WP REST API 中使用 register_rest_field 在另一个字段下嵌套一个字段

如何提交“无效的请求[0] .updateTextStyle:必须在“字段”中列出至少一个字段。(使用“ *”表示所有字段。)“>“

如何使用 FilterUserMixin 过滤 Django 中的一个字段或另一个字段

如何在django admin中基于另一个字段的查找设置字段值?

Angular 2或4反应性表单集验证取决于另一个字段值

如何仅在xsd中的一个字段中验证最大长度

如何在Angular中的另一个字段更改时禁用元素/更改样式

如何在SQL查询的一个字段中求和多个字段?