Тема не запускается при вызове из родительского компонента в ngOnInit - PullRequest
1 голос
/ 09 июля 2019

Я использую Rxjs и Angular 7. У меня есть родительский компонент и дочерний компонент. У меня есть метод для вызова Subject моего дочернего компонента:

updateSubject(text: string) {
  this.subject$.next(text);
}

И я вызываю это из моего родительского компонента в ngOnInit, используя ViewChild:

ngOnInit() {
  this.childComponent.updateSubject('New Text');
}

Но subscribe для this.subject$ никогда не срабатывает, если я вызываю его с ngOnInit в родительском компоненте. Если я вызываю метод, используя кнопку из родительского или дочернего элемента, subscribe срабатывает нормально. Что я делаю не так?

См. Демонстрацию StackBlitz здесь .

Ответы [ 3 ]

3 голосов
/ 09 июля 2019

subscribe() у потомка вызывается после , когда инициализируется родитель.Angular инициализирует компоненты в том же порядке, что и DOM, поэтому сначала инициализируется родительский компонент, а затем инициализируется дочерний элемент.

A Subject() отбрасывает излучаемые значения, если ничего не подписано, и поскольку дочерний элемент подписываетсяпоздно он не получает значение.

Вы можете использовать BehaviorSubject () или ReplaySubject () в зависимости от того, нужно ли вам начальное значение или нет.

1 голос
/ 09 июля 2019

Вам необходимо использовать AfterViewInit крючок жизненного цикла.Ваш дочерний компонент еще не отображался при вызове OnInit.

Так что это будет работать:

ngAfterViewInit() {
 this.childComponent.updateSubject('View initialized');
}
0 голосов
/ 09 июля 2019

Используйте BehaviorSubject вместо Subject

subject$: BehaviorSubject<string> = new BehaviorSubject<string>(null);

Следуйте этому вопросу, чтобы понять разницу между Subject и BehaviorSubject

Разница между субъектом и поведением субъекта

...