Угловые реактивные формы: valueChanges не работает должным образом - PullRequest
0 голосов
/ 16 октября 2018

Я учусь использовать Реактивные Формы в Angular 6, так что простите, если этот вопрос глуп, но вот моя проблема:

Я хочу отслеживать изменения определенного значения в моей реактивной форме,потому что когда происходит изменение, мне нужно запустить некоторую логику, которая пересчитывает вещи на основе новых значений.Поэтому я попытался сделать это:

this.inputGroup = formBuilder.group({
  myControl: 'something'
});

this.inputGroup.get('myControl').valueChanges.subscribe(newVal => {
  console.log("new value", newVal); //Prints the correct new value
  console.log("actual value", this.inputGroup.value.myControl); //Prints the previous (old) value!

  this.someFuncThatExpectsTheValuesToBeUpToDate(); //This will find the OLD value inside this.inputGroup.value.myControl, instead of the new one!
});

, но, как вы можете видеть из комментариев, которые я вставил в код, это не работает, потому что valueChanges, кажется, вызывается до значение фактически изменено в модели!Это намеренное поведение?Сигнатура метода для valueChanges гласит:

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

, такЯ бы предположил, что он был назван ПОСЛЕ того, как значение было изменено в форме, но, очевидно, нет ... это правильно?И если да, то как я могу определить, когда значение фактически изменилось в элементе управления?

РЕДАКТИРОВАТЬ : кажется, что существует некоторая путаница (как всегда здесь, на SO: D) относительно ПОЧЕМУ Iхочу, чтобы моя функция обращалась к данным непосредственно из группы Form, а не передавала новое значение самой функции.Это легко объяснить: функция собирает данные из нескольких групп форм и использует эти данные для некоторых побочных вычислений.Получая доступ к данным непосредственно из групп форм, функция является общей и может быть вызвана из любого места.Если я начну помещать туда входные параметры, это сломается.Возьмите этот пример:

someFuncThatExpectsTheValuesToBeUpToDate(){
  let val1 = inputGroup.value.myControl;
  let val2 = someOtherFormGroup.value.myOtherControl;
  let val3 = yetAnotherFormGroup.value.someOtherControl;
  //do something with the vals
}

С помощью этой функции я могу вызвать ее из любого места, и она будет работать.Но если мне нужно каждый раз передавать значения, мне понадобятся 3 разные функции с разными сигнатурами, чтобы делать одно и то же, гораздо более грязное и сложное.

1 Ответ

0 голосов
/ 16 октября 2018

Событие valueChanges наступает после того, как новое значение обновлено до значения FormControl, и до того, как изменение будет передано его родителю и предкам.Следовательно, вам нужно получить доступ к значению самого FormControl, а не к полю объекта значения FormGroup.

console.log this.inputGroup.get('myControl').value внутри подписки, и оно будет иметь новое значение.

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