针对多个案例的可恢复验证器

时间:2017-02-20 17:55:38

标签: validation angular custom-validators reactive-forms

我做了一个日期验证器。它验证现有日期。我需要多个日期验证器以及其他限制,例如:最大日期验证器不允许用户放入未来日期或日期验证器只需要过去的日期。这是我目前的验证工具。

    export function dateValidator(group) {

  const {day, month, year} = group.value;
  const fullDate = `${day}/${month}/${year}`;
  const dobPattern = /^(\d{1,2})[-\/](\d{1,2})[-\/](\d{4})$/;
  const isStringValid = dobPattern.test(fullDate);

  let isValid = false;

  if (isStringValid) {
    const intDay = Number(day);
    const intMonth = Number(month);
    const intYear = Number(year);
    const jsMonth = intMonth - 1;
    const date = new Date(intYear, jsMonth, intDay);
    isValid = (date.getFullYear() === intYear && date.getMonth() === jsMonth && date.getDate() === intDay ;
  }

  return isValid ? null : { invalid: 'Invalid date' };
};

如何限制用户放入以后的日期。 我将此代码用于以下行:

    isValid = (date.getFullYear() === intYear && date.getMonth() === jsMonth && date.getDate() === intDay ;

但是我想知道是否有一种更简单的方法,而不必一遍又一遍地复制和通过这些代码来对它进行小的限制。

1 个答案:

答案 0 :(得分:1)

您的dateValidator()函数应该是函数工厂(即一个返回函数的函数)而不是直接返回错误的函数:

export function dateValidator(maxDate: string): ValidatorFn {
  // Return a validator function.
  return (group: FormGroup): {[key: string]: any} => {
    // Re-use your existing validation code here and return the error if any.
    // Optionally, use the `maxDate` param to customize the validation:
    // entered dates should not go beyond `maxDate`.
  };
}

如您所见,您可以通过将参数传递给函数工厂来自定义验证器函数。在我的示例中,我使用maxDate参数来指示验证程序应允许的最晚日期。

表单模型中,通过使用适当的值调用工厂来使用此验证程序,例如: :

this.myForm = fb.group({
  'date': ['', [Validators.required(), dateValidator('02/20/2017')]]
});

您可以在doc:https://angular.io/docs/ts/latest/cookbook/form-validation.html#custom-validation

中查看验证程序的另一个函数工厂示例