Je sais comment créer un événement avec l'EventEmitter. Je peux également attacher une méthode à appeler si j'ai un composant comme celui-ci:
<component-with-event (myevent)="mymethod($event)" />
Quand j'ai un composant comme celui-ci, tout fonctionne très bien. J'ai déplacé une certaine logique dans un service et je dois déclencher un événement depuis l'intérieur du service. Voici ce que j'ai fait:
export class MyService {
myevent: EventEmitter = new EventEmitter();
someMethodThatWillRaiseEvent() {
this.myevent.next({data: 'fun'});
}
}
J'ai un composant qui doit mettre à jour une certaine valeur en fonction de cet événement, mais je n'arrive pas à le faire fonctionner. Voici ce que j'ai essayé:
//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
}
}
Comment puis-je faire en sorte que MyComponent s'abonne à l'événement lorsque le service qui le déclenche n'est pas un composant?
Je suis sur 2.0.0-alpha.28
EDIT: J'ai modifié mon "exemple de travail" pour qu'il fonctionne réellement, afin que l'accent puisse être mis sur la partie qui ne fonctionne pas;)
Exemple de code: http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv
la source
Réponses:
Mise à jour : J'ai trouvé un moyen meilleur / approprié de résoudre ce problème en utilisant un BehaviorSubject ou un Observable plutôt qu'un EventEmitter. Veuillez consulter cette réponse: https://stackoverflow.com/a/35568924/215945
En outre, les documents Angular ont maintenant un exemple de livre de recettes qui utilise un sujet .
Réponse originale / obsolète / fausse: encore une fois, n'utilisez pas un EventEmitter dans un service . C'est un anti-modèle.
Utilisation de beta.1 ... NavService contient EventEmiter. Component Navigation émet des événements via le service et le composant ObservingComponent s'abonne aux événements.
nav.service.ts
components.ts
Plunker
la source
providers: [NavService]
? Si tel est le cas, vous obtiendrez plusieurs instances du service.subscribe()
méthode. En utilisant une méthode, nous pouvons facilement changer l'EventEmitter en Subject ou en Observable, ce qui est bien mieux, car nous avons maintenant appris que EventEmitters ne doit être utilisé que pour les propriétés de sortie. La bonne façon est d'utiliser un Subject, BehaviorSubject ou Observable, et nous y souscrivons normalement directement, donc nous n'avons plus besoin d'une méthode getNavChangeEmitter ().En utilisant alpha 28, j'ai réussi à m'abonner par programmation à des émetteurs d'événements via la
eventEmitter.toRx().subscribe(..)
méthode. Comme ce n'est pas intuitif, cela pourrait peut-être changer dans une prochaine version.la source
click.toRx().subscribe(your_callback_function)