Quiero enviar un mensaje de ComponentA a ComponentB. Y estoy usando el servicio para eso. Aquí está el código: mi problema es que si llamo a sendInfoToB() desde el archivo html del componente A (evento vinculado a un clic de botón), recibo el mensaje en el componente B /obteniendo console.log(this.check); y consola.log(mensaje); 's en la consola... pero cuando llamo a this.sendInfoToB(true); de ngOnInit() del componente A, no recibo ningún mensaje en la consola para el componente B. Quiero el mensaje cuando llamo desde ngOnInit de componentA. ¿Cómo puedo lograr eso? Por favor ayuda. Gracias de antemano.
ComponentA.ts
constructor(private siblingService: SiblingService,) {} public dataX: boolean = false; someFunc(){ //some calculation returning true this.dataX = true; } ngOnInit() { this.someFunc(); this.sendInfoToB(); } sendInfoToB() { this.siblingService.communicateMessage(dataX); }mensaje.servicio.ts
export class SiblingService { sendMessage = new Subject(); constructor() {} communicateMessage(msg) { this.sendMessage.next(msg); } }ComponentB.ts
constructor(private sibService: SiblingService,) {} ngOnInit() { this.sibService.sendMessage.subscribe((message) => { this.check = message; console.log(this.check); console.log(message); }); }Lo más probable es que esto tenga que ver con el orden de las operaciones. El Componente A se crea y envía el mensaje, luego el Componente B se crea y se suscribe a nuevos mensajes. Dado que está utilizando un Asunto, solo le da mensajes enviados después de suscribirse.
La estrategia más fácil para esto es usar un BehaviorSubject.
export class SiblingService { sendMessage = new BehaviorSubject(); constructor() {} communicateMessage(msg) { this.sendMessage.next(msg); } }La otra forma es enviar el mensaje después de que ocurra el inicio, como en un evento de clic.