Angular 仅当特定窗体控件(较大窗体组的一部分)中的另一个特定窗体控件具有值时,才有条件地根据需要设置该窗体控件

Angular 仅当特定窗体控件(较大窗体组的一部分)中的另一个特定窗体控件具有值时,才有条件地根据需要设置该窗体控件,angular,forms,validation,ionic-framework,Angular,Forms,Validation,Ionic Framework,我已经看到了许多其他类似于这个场景的问题,但不完全是我想要的 我在我的typescript文件中创建了一个表单组,其中包含一大堆表单控件id、firstName、lastName、email等。。有些控件设置了validator.required,有些则没有 我遇到了这样一种情况,我确信这是相当常见的,我只希望将此组中的一个特定表单控件设置为必需的,只有当组中的一个其他控件具有值时,另一个控件才是必需的 处理此问题的最佳实践是什么 比如说,我有下面的方法来设置表单组 private initFo

我已经看到了许多其他类似于这个场景的问题,但不完全是我想要的

我在我的typescript文件中创建了一个表单组,其中包含一大堆表单控件id、firstName、lastName、email等。。有些控件设置了validator.required,有些则没有

我遇到了这样一种情况,我确信这是相当常见的,我只希望将此组中的一个特定表单控件设置为必需的,只有当组中的一个其他控件具有值时,另一个控件才是必需的

处理此问题的最佳实践是什么

比如说,我有下面的方法来设置表单组

private initFormClient(): FormGroup {
    let clientGroup = this.fb.group({
        id: [client.id], //hidden
        firstName: [client.firstName, Validators.required],
        lastName: [client.lastName, Validators.required],
        email: [client.email, Validators.required]),
        phone: [client.phone],
        birthday: [moment(client.birthday).format('YYYY-MM-DD'), Validators.required],
        enrollmentDate: [moment(this.workingEnrollment.enrollmentDate).format('YYYY-MM-DD'), Validators.required],
        dischargeDate: [this.workingEnrollment.dischargeDate ?moment(this.workingEnrollment.dischargeDate).format('YYYY-MM-DD') : undefined],
        treatmentLevelDate: [this.workingEnrollment.treatmentLevelDate ? moment(this.workingEnrollment.treatmentLevelDate).format('YYYY-MM-DD') : undefined],
        treatmentLevelId: 
        profileImageUri: [client.profileImageUri],
        profileImageFile: [''],
    });
    return clientGroup;
}

仅当用户选择了treatmentLevelId的值时,我才希望将treatmentLevelDate控件设置为所需。除非有必要,否则我不想向组中添加全局验证器。如果可能的话,我宁愿学习如何为单个控件设置自定义验证器。谢谢你的帮助

您可以尝试使用以下函数动态设置验证器:

ngOnInit() {
  this.form = this.initFormClient();

  this.form.get('firstName').valueChanges.subscribe(val => {
    if ((val || '').split(' ').filter(Boolean).length > 1) {
      this.form.get('lastName').clearValidators();
    }
    else {
      this.form.get('lastName').setValidators(Validators.required);      
    }
    this.form.get('lastName').updateValueAndValidity();
  });
}
在本例中,仅当“姓氏”字段包含少于2个单词时,才需要“姓氏”字段。如果名字字段包含超过1个单词,则姓氏字段将不再是必需的