Отслеживание изменения переменной в угловой

#angular #rxjs

Вопрос:

У меня есть компонент с одним дочерним компонентом, к которому я не могу получить доступ и изменить код. Чтобы что-то работало, мне нужно получить доступ к переменной внутри дочернего компонента в начале родительского компонента, однако дочерний компонент всегда опаздывает. Есть ли способ для меня подписаться на переменную (я пробовал с RxJS, однако мне не повезло, может быть, я просто сделал что-то не так). Я использовал дочерний элемент представления, и я могу получить доступ к переменной позже, однако в OnInit она все еще не определена, есть ли способ дождаться ее внутри OnInit, а затем вызвать остальные функции?

 @ViewChild("test") test;
 ngOnInit() {
    
    // console.log(this.test.model.test1);
    // const subject = new BehaviorSubject(this.test.model.test1);
    // subject.subscribe(console.log);
    
    // this.test.model.test1.toPromise().then(res => {console.log(res)});
  }
 

Ответ №1:

Вы можете читать дочерние данные только после проверки представления, поэтому используйте ngAfterViewInit вместо ngOnInit .

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

Ответ №2:

Твоя проблема:

Дочерний компонент будет инициализирован только после того, как шаблон вашего родительского компонента будет инициализирован, как упоминалось в @kvetis. Поэтому самое раннее, чего вы можете ожидать от своего ребенка,- это то, что происходит с вашими родителями afterViewInit() в течение жизненного цикла.

Общая коммуникация между ребенком и родителем

Как правило, вы используете @Output декоратор для свойства childs, которое затем может выдавать либо событие, либо значение (которое rxjs может присоединиться к изображению). И привязать к этому выходу в шаблоне ваших родителей:

ребенок.тс

 ...

@Output
_model = new Subject<MyModelType>();

...

ngOnInit() {
  someLogic();
  this.model.next(whatEver);
}
...
 

parent.html

 ...
<child-selector (_model)="handleChildValue($event)">
...
 

родитель.ts

 ...

handleChildValue(model: MyModelType) {
  doStuffWithModel();
}

...
 

В качестве альтернативы вы можете использовать EventEmitter вместо a Subject .