如何以 angular 反应形式强制一个日期大于另一个日期?

How to enforce that one date is bigger than the other in angular reactive form?

我有以下反应形式:

  newTripForm = this.formBuilder.group({
    name: new FormControl('', Validators.compose([Validators.required, Validators.minLength(3)])),
    startDate: new FormControl('', Validators.required),
    endDate: new FormControl(''),
  });

如何添加验证器强制结束日期大于开始日期?另外,有没有办法检查 startDate 和 endDate 是否是日期?我没有找到任何验证器?

非常感谢您(对于菜鸟问题​​深表歉意)

您目前使用的验证器是FormControl-验证器。他们验证了一个 FormControl。您还可以自己编写一个验证器来验证 FormArrayFormGroup。 验证器看起来像这样:

dateOrderValidator(formGroup: FormGroup): ValidationErrors | null {
  const startDate = formGroup.controls['startDate']?.value;
  const endDate = formGroup.controls['endDate']?.value;
  // validate date-strings
  // catch missing values
  if (Date.parse(startDate).getTime() >= Date.parse(endDate).getTime)) {
    // return an appropriate error
  }
}

表单生成器

FormBuilder 的主要目的是为我们节省一些样板文件。代替 name: new FormControl(...) 我们可以写

name: ['initialValue', [<synchronous validators>], [<asynchronous validators]]

甚至更少(如果我们没有验证器):

name: 'initialValue'

如果您的控件是一个普通的日期输入,这将完成这项工作,如果您的控件是自定义类型,例如 ngBootstrap 日期选择器“就像我的情况”,您可以格式化这些值

export class DateValidators {
  static greaterThan(startControl: AbstractControl): ValidatorFn {
    return (endControl: AbstractControl): ValidationErrors | null => {
      const startDate: Date = startControl.value;
      const endDate: Date = endControl.value;
      if (!startDate || !endDate) {
        return null;
      }
      if (startDate >= endDate) {
        return { greaterThan: true };
      }
      return null;
    };
  }
}

用法

const startControl = this.formBuilder.control('');
const endControl = this.formBuilder.control('', [DateValidators.greaterThan(startControl)]);