Eu sei como gerar um evento com o EventEmitter. Também posso anexar um método a ser chamado se tiver um componente como este:
<component-with-event (myevent)="mymethod($event)" />
Quando tenho um componente como esse, tudo funciona muito bem. Mudei alguma lógica para um serviço e preciso gerar um evento de dentro do serviço. O que eu fiz foi isso:
export class MyService {
myevent: EventEmitter = new EventEmitter();
someMethodThatWillRaiseEvent() {
this.myevent.next({data: 'fun'});
}
}
Eu tenho um componente que precisa atualizar algum valor com base neste evento, mas não consigo fazer funcionar. O que eu tentei foi isso:
//Annotations...
export class MyComponent {
constructor(myService: MyService) {
//myService is injected properly and i already use methods/shared data on this.
myService.myevent.on(... // 'on' is not a method <-- not working
myService.myevent.subscribe(.. // subscribe is not a method <-- not working
}
}
Como faço para que MyComponent se inscreva no evento quando o serviço que o gera não é um componente?
Estou em 2.0.0-alpha.28
EDIT: Modifiquei meu "exemplo de trabalho" para realmente funcionar, então o foco pode ser colocado na parte que não está funcionando;)
Código de exemplo: http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv
fonte
Respostas:
Update : Eu encontrei uma maneira melhor / adequada de resolver este problema usando um BehaviorSubject ou um Observable em vez de um EventEmitter. Veja esta resposta: https://stackoverflow.com/a/35568924/215945
Além disso, os documentos Angular agora têm um exemplo de livro de receitas que usa um Assunto .
Resposta original / desatualizada / errada: novamente, não use um EventEmitter em um serviço . Isso é um anti-padrão.
Usando beta.1 ... NavService contém o EventEmiter. O Component Navigation emite eventos por meio do serviço e o componente ObservingComponent se inscreve nos eventos.
nav.service.ts
components.ts
Plunker
fonte
providers: [NavService]
? Nesse caso, você obterá várias instâncias do serviço.subscribe()
método. Usando um método, podemos facilmente alterar o EventEmitter para um Assunto ou Observable, o que é muito melhor, pois agora aprendemos que EventEmitters deve ser usado apenas para propriedades de saída. A maneira correta é usar um Assunto, BehaviorSubject ou Observable, e normalmente os assinamos diretamente, portanto, não precisamos mais de um método getNavChangeEmitter ().Usando o alfa 28, consegui inscrever-me programaticamente em emissores de eventos por meio do
eventEmitter.toRx().subscribe(..)
método. Como não é intuitivo, pode ser alterado em uma versão futura.fonte
click.toRx().subscribe(your_callback_function)