Angular2 – Interação entre componentes usando um serviço

Eu tenho dois componentes A e B, onde o componente A contém um botão. Eu desejo que quando o usuário clicar neste botão, dispare uma function no componente B

  

E o componente B é renderizado usando o roteamento. Estou pensando em usar um serviço com um booleano observável que indique se o botão em A é clicado. Este é o caminho certo para alcançá-lo?

O serviço compartilhado é um meio comum de comunicação entre componentes não relacionados. Seus componentes precisam usar uma única instância do serviço , portanto, verifique se ele é fornecido no nível raiz.

Um exemplo usando o BehaviorSubject como um delegado de dados :

Serviço compartilhado:

 @Injectable() export class SharedService { isVisibleSource: BehaviorSubject = new BehaviorSubject(false); constructor() { } } 

Componente 1:

 export class Component1 { isVisible: boolean = false; constructor(private sharedService: SharedService) { } onClick(): void { this.isVisible = !this.isVisible; this.sharedService.isVisibleSource.next(this.isVisible); } } 

Componente 2:

 export class Component2 { constructor(private sharedService: SharedService) { } ngOnInit() { this.sharedService.isVisibleSource.subscribe((isVisible: boolean) => { console.log('isVisible: ', isVisible); // => true/false }); } } 

Vale ressaltar que BehaviorSubject em uma assinatura retorna o último valor que ele contém, portanto, o componente do exemplo acima será atualizado com o valor mais recente imediatamente após a instanciação.

BehaviorSubject também permite obter seu valor mais recente sem subscrevê-lo:

 this.sharedService.isVisibleSource.getValue(); // => true/false 

Serviço Angular

Você tem que usar um serviço para se comunicar entre seus dois componentes.

Consulte https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

Seu serviço tem um evento de propriedade. Assim, o componente A pode emitir o evento e o componente B pode se inscrever nele.

Use o RxJS para emitir e assinar seu evento.

Se minha resposta não satisfaz você. Por favor, me diga e eu vou trabalhar nisso.