Можно ли передавать динамические значения в валидатор настраиваемой формы в Angular 6?

в основном, у меня есть некоторые входные данные формы, проверки которых зависят друг от друга (то есть, если вы вводите временной диапазон, время «от» должно быть меньше, чем время «до»), но я не совсем уверен, как иди об этом.

Вот моя группа форм:

this.form = this.fb.group({
  fromTime: ["", [Validators.required, CustomValidator.myValidationFunction(this.form.get("toTime").value)]],
  toTime: ["", [Validators.required]]
});

А вот и мой валидатор:

static myValidationFunction(testing) {
    const toTime = testing; // only comes here 1 time
    return control => {
      return toTime /*this value never changes*/  ? null : { test: {} };
    };
  }

но кажется, что значение x или toTime устанавливается только в первый раз, когда создается валидатор. есть ли способ передать динамические входные данные пользовательскому валидатору?

Я новичок в angular, но прочитал документацию по проверке пользовательской формы но не могу найти свой ответ


person philr    schedule 18.09.2018    source источник
comment
Вы пытались вернуть функцию в своей пользовательской функции проверки?   -  person Nour    schedule 18.09.2018
comment
@Nour, это то, что я делаю, но, похоже, единственное, что я могу передать, это FormControl, который проверяется   -  person philr    schedule 18.09.2018
comment
Может ли это помочь вам, когда они используют валидатор во всей форме? medium.com/@realTomaszKula/   -  person Jan B.    schedule 18.09.2018
comment
@Matt, эта ссылка / пример очень интересна и может помочь, но она включает в себя проверку всей формы каждый раз, когда вводится, в отличие от проверки самого ввода   -  person philr    schedule 18.09.2018
comment
Верно, но нет ничего плохого в том, чтобы подтянуть проверку к FormGroup. На самом деле это очень похоже на шаблоны проектирования, управляемые доменом, где сущности (здесь: FormControl) иногда не могут подтвердить себя, и вам необходимо включить логику на уровне обслуживания (здесь: FormGroup). Что касается проверки на уровне формы, она не менее чиста, чем проверка поля imo. Преимущество состоит в том, что логика перекрестной проверки находится в одном месте, и вы можете получить доступ ко всем, содержащим FormControls, и установить ValidationErrors в обоих полях.   -  person Jan B.    schedule 18.09.2018
comment
@ Матт, в этом есть смысл. Кажется, у меня все равно нет выбора, поэтому я продолжу проверку на уровне FormGroup. Спасибо за помощь!   -  person philr    schedule 18.09.2018
comment
Я полностью понимаю ваше беспокойство. Ваша проблема довольно проста в дизайне форм на основе шаблонов, но непроста в реактивных формах. Тем не менее, я думаю, что использовать этот подход абсолютно нормально (что почти то же самое, что и Бучковски).   -  person Jan B.    schedule 18.09.2018


Ответы (1)


static TimeValidator(formGroup) {
    const fromTime = formGroup.controls.fromTime;
    const toTime = formGroup.controls.toTime;

    if (fromTime.value && toTime.value) {
        if (toTime.value <= fromTime.value) {
            return {time: true};
        }

    }
    return null;
}

ngOnInit(): void {
    this.form = new FormGroup({
        fromTime: new FormControl('', Validators.required),
        toTime: new FormControl('', Validators.required)
    }, AppComponent.TimeValidator);

    this.form.controls.fromTime.setValue(2);
    this.form.controls.toTime.setValue(1);
}

а в html вы можете проверить:

{{form.hasError('time')}}

Не стесняйтесь спрашивать, если у вас есть вопросы.

person Buczkowski    schedule 18.09.2018
comment
это фактически решит мою проблему! один вопрос: есть ли способ узнать, какой именно ввод был изменен, чтобы избежать проверки всей моей формы каждый раз, когда какой-либо ввод был изменен? - person philr; 18.09.2018
comment
честно говоря, я не могу с этим помочь, я знаю, что валидаторы наверняка FormControl получают ссылку на элемент управления формой в функции валидатора в качестве аргумента, а в случае FormGroup передается ссылка на группу форм. - person Buczkowski; 18.09.2018
comment
@philr Почему вы не хотите запускать этот валидатор при каждом изменении? Не должно быть заметного снижения производительности, если вы не запускаете http-вызовы или очень дорогие вычисления. - person Jan B.; 18.09.2018