Ich weiß, wie man mit dem EventEmitter ein Ereignis auslöst. Ich kann auch eine aufzurufende Methode anhängen, wenn ich eine Komponente wie diese habe:
<component-with-event (myevent)="mymethod($event)" />
Wenn ich eine solche Komponente habe, funktioniert alles hervorragend. Ich habe eine Logik in einen Dienst verschoben und muss ein Ereignis innerhalb des Dienstes auslösen. Was ich getan habe war folgendes:
export class MyService {
myevent: EventEmitter = new EventEmitter();
someMethodThatWillRaiseEvent() {
this.myevent.next({data: 'fun'});
}
}
Ich habe eine Komponente, die einen Wert basierend auf diesem Ereignis aktualisieren muss, aber ich kann nicht scheinen, dass es funktioniert. Was ich versucht habe war folgendes:
//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
}
}
Wie kann ich MyComponent dazu bringen, das Ereignis zu abonnieren, wenn der Dienst, der es auslöst, keine Komponente ist?
Ich bin auf 2.0.0-alpha.28
BEARBEITEN: Mein "Arbeitsbeispiel" wurde so geändert, dass es tatsächlich funktioniert, sodass der Fokus auf den nicht funktionierenden Teil gelegt werden kann;)
Beispielcode: http://plnkr.co/edit/m1x62WoCHpKtx0uLNsIv
quelle
Antworten:
Update : Ich habe einen besseren / richtigen Weg gefunden, um dieses Problem mit einem BehaviorSubject oder einem Observable anstelle eines EventEmitter zu lösen. Bitte lesen Sie diese Antwort: https://stackoverflow.com/a/35568924/215945
Außerdem haben die Angular-Dokumente jetzt ein Kochbuchbeispiel, das einen Betreff verwendet .
Ursprüngliche / veraltete / falsche Antwort: Verwenden Sie erneut keinen EventEmitter in einem Dienst . Das ist ein Anti-Muster.
Verwenden von Beta.1 ... NavService enthält den EventEmiter. Die Komponentennavigation sendet Ereignisse über den Dienst, und die Komponente ObservingComponent abonniert die Ereignisse.
nav.service.ts
Komponenten.ts
Plunker
quelle
providers: [NavService]
? In diesem Fall erhalten Sie mehrere Instanzen des Dienstes.subscribe()
Methode verfügt. Mithilfe einer Methode können wir den EventEmitter leicht in einen Betreff oder ein Observable ändern, was viel besser ist, da wir jetzt gelernt haben, dass EventEmitter nur für Ausgabeeigenschaften verwendet werden sollten. Der richtige Weg ist die Verwendung eines Betreffs, eines BehaviorSubjects oder eines Observable, und wir abonnieren diese normalerweise direkt, daher benötigen wir keine getNavChangeEmitter () -Methode mehr.Mit Alpha 28 habe ich es geschafft, Ereignisemitter mithilfe der
eventEmitter.toRx().subscribe(..)
Methode programmgesteuert zu abonnieren . Da es nicht intuitiv ist, kann es sich möglicherweise in einer zukünftigen Version ändern.quelle
click.toRx().subscribe(your_callback_function)