Проблема с синхронизацией Angular NGRX/Reactive Form и ngOnChanges

Угловой 9

Я пытаюсь использовать ngOnchanges для запуска загрузки моей формы. Данные для формы поступают из @input из компонента оболочки.

У меня проблема в том, что ngOnChanges срабатывает ДО ngOnit, и форма еще не создана для заполнения данных.

Поигравшись с этим, я установил временное исправление с помощью setTimeout, но это не идеально.

ngOnChanges(changes: SimpleChanges): void {
 setTimeout(() => {
    // patch form with value from the store
    if (changes.profile) {
      const profile: IProfile = changes.profile.currentValue;
      this.displayProfile(profile);
    }
  }, 0);
}

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

Это кажется довольно фундаментальным. что мне не хватает?

Спасибо.


person Darren Street    schedule 18.05.2021    source источник
comment
Зачем вам ngOnChanges? Входное значение поступает из хранилища?   -  person dallows    schedule 18.05.2021
comment
да, ngOnChanges удобен для обработки любых изменений состояния обратно в форму.   -  person Darren Street    schedule 18.05.2021


Ответы (2)


Вы можете добиться этого с помощью установщика @Input() без необходимости ngOnChanges:

@Input()
set profile(profile) {
  this.displayProfile(profile);
}
person Gérôme Grignon    schedule 18.05.2021

Вы можете использовать один из этих очень полезных шаблонов, описанных в ответе ниже:

как остановить ngOnChanges, вызываемый до ngOnInit()

person Oana    schedule 18.05.2021
comment
Логическое решение не сработало для меня. SimpleChanges с isFirstChange также. Откровенно говоря, установка SetTimeout чище, чем возня с новой темой. - person Darren Street; 18.05.2021
comment
Ну... попробуйте другие, особенно: API SimpleChanges: !changes["bar"].isFirstChange() - person Oana; 18.05.2021
comment
Я хочу сказать, что это довольно фундаментально, но требует возни. Я просмотрел документацию и не смог найти единого подхода. - person Darren Street; 18.05.2021