Установите динамический ValidationFn в форму группы реагирования - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь создать очень общую \ динамическую реактивную форму, которая может использовать пользовательскую функцию проверки для группы форм (для сравнения 2 дат).Эта функция может быть любой функцией проверки типа ValidatorFn:

export interface ValidatorFn {
(control: AbstractControl): ValidationErrors | null;
}

Вот основная проблема:
Я определяю функцию в виде файла конфигурации и запускаю реактивную формус ним (получая функцию в качестве параметра) и установите formGroup с validationFn.Вот функция:

customValidationFunction : ValidatorFn = (group : FormGroup) : ValidationErrors | null => 
{
  return (/*control : AbstractControl*/)/*:{[key: string] : any} | null*/ => 
  {
    if (group.controls["CreatedDateFormatFrom"] && group.controls["CreatedDateFormatTo"])
    {
      let from : AbstractControl = group.get("CreatedDateFormatFrom");
      let to : AbstractControl = group.get("CreatedDateFormatTo");
      const inValid = from && to &&  to.value < from.value;
      return inValid ? {'invalidDates' : true } : null;   
    }
    return null;
  }
}

Теперь в инициализации реактивной формы «настроить \ универсальный \ динамически созданный» я задаю функцию (или некоторые функции):

initForm(formGroupCustomValidation? : ValidatorFn[] )
{
   let group: any = {};
   //Here I initiate the group with FormControls, for example:
   group[<fieldName>] = new FormControl(<some value> || ''); 
   //This is where the custom validation function comes:
   if (formGroupCustomValidation)
   {
      this.form = new FormGroup(group, {validators:                
                                        formGroupCustomValidation });  
   }
   this.form.valueChanges.subscribe(values => {
     console.log(values);
     this.formValid();
   })
}

IПрошу прощения за «размытый» код, но это связано с динамически создаваемой формой.Проблема в том, как передать и выполнить функцию с параметром group: FormGroup?Я склонен полагать, что у меня есть некоторая проблема с определением функции \ областью действия и т. Д. Я не вижу тела функции, вызываемого при попытке отладки функции.Пожалуйста Поддержи.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вам не нужно возвращать другую функцию, поскольку вы не передаете дополнительные аргументы, этого будет достаточно:

  customValidationFunction: ValidatorFn = (group: FormGroup) => {
    const from: AbstractControl = group.get('CreatedDateFormatFrom');
    const to: AbstractControl = group.get('CreatedDateFormatTo');

    if (from && to) {
      const inValid = from && to && to.value < from.value;
      return inValid ? {'invalidDates': true} : null;
    }
    return null;
  }

Редактировать 1:

Хорошо, я немного пропустил пункттак как вы хотите передать эту первую группу второй и выполнить проверку элементов управления из первой.

Это должно работать:

    const group = new FormGroup({
      CreatedDateFormatFrom: new FormControl(),
      CreatedDateFormatTo: new FormControl()
    });

    const group2 = new FormGroup({anotherGroup: group}, this.customValidationFunction(group));

    group.controls.CreatedDateFormatFrom.setValue('11-12-2018');
    group.controls.CreatedDateFormatTo.setValue('11-11-2018');

  customValidationFunction: ValidatorFn = (group: FormGroup) => {
    return () => {
      const from: AbstractControl = group.get('CreatedDateFormatFrom');
      const to: AbstractControl = group.get('CreatedDateFormatTo');

      if (from && to) {
        const inValid = from && to && to.value < from.value;
        return inValid ? {'invalidDates': true} : null;
      }
      return null;
    };
  }
0 голосов
/ 30 апреля 2019

ОК, я нашел решение, как и @Buczkowski. Вот мой исправленный код (оставленный код закомментирован специально - чтобы показать разницу):

customValidationFunction: ValidatorFn /*: ValidatorFn*/ = (group : FormGroup) /*: 
 ValidationErrors | null*/ => 
{
/*return (control : AbstractControl):{[key: string] : any} | null => 
{*/
   if (group.controls["CreatedDateFormatFrom"] && 
      group.controls["CreatedDateFormatTo"])
   {
     let from : AbstractControl = group.get("CreatedDateFormatFrom");
     let to : AbstractControl = group.get("CreatedDateFormatTo");
    const inValid : boolean = from && to && from.value && to.value && to.value < from.value;
    return inValid ? {'invalidDates' : true } : null;   
  }
  return null;
/*}*/

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...