Динамический способ добавления валидаторов реактивных форм в Angular 2?

#angular #typescript

#angular #typescript

Вопрос:

Я читал кулинарную книгу Angular 2 по динамическим формам, используя модуль реактивных форм (https://angular.io/docs/ts/latest/cookbook/dynamic-form.html )

Я заметил, что они определяют, как динамически создавать элементы управления формами, такие как :

     questions.forEach(question => {
  group[question.key] = question.required ? new FormControl(question.value || '', Validators.required)
                                          : new FormControl(question.value || '');
});
  

Для начала это кажется замечательным, но каков наилучший подход для этого, если у вас есть несколько или пользовательские валидаторы? Например, если бы у меня был существующий элемент управления формой, который был определен как

 this.myForm= this.formBuilder.group({
        inputField:   [this.myObject.inputValueField, [Validators.required,Validators.minLength(4),
            forbiddenValueValidator(5000)]]
    });
  

Итак, в этом случае у меня был бы ввод, который требуется, имеет минимальную длину 4 и не может быть равен 5000, принудительно выполняемый пользовательской функцией проверки.

Извините, если есть какие-либо дубликаты, подобные этому, но я не смог найти ничего, что действительно указывало бы на решение динамического / метаданного подхода к нескольким валидаторам с созданием экземпляра нового FormControl

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

Вот моя потенциальная идея для исправления:

Я думаю, что теперь я понял, хотя, примерно, это так:

 validations = {
    required: true,
    minLength:true,
    customCalls: [forbiddenValueValidator(5000)]
};

    let myValidators = [];
    if(this.validations.required) {
        myValidators .push(Validators.required);
    }
    if(this.validations.minLength) {
        myValidators .push(Validators.minLength(4));
    }
    if(this.validations.customCalls amp;amp; this.validations.customCalls.length > 0) {
        for (let customCall of this.validations.customCalls) {
            myValidators .push(customCall);
        }
    }
  

объект validations может быть другой частью метаданных json, представляющих данные вопросов, а остальное может быть быстрой функцией, которая просто создает массив для валидаторов. Тогда создание элемента управления будет выглядеть следующим образом:

  group[question.key] = myValidators.length > 0 ? new FormControl(question.value || '', myValidators)
                                      : new FormControl(question.value || '');
  

Комментарии:

1. что вы подразумеваете под «динамическим»?

2. В принципе, мы можем определить, какие валидаторы использовать с помощью метаданных, например, как они определяли формы в примере динамических форм в Angular cookbook.

3. Я примерно понял это, я добавлю это в качестве правки к вопросу