2016-10-25 2 views
1

Ich versuche Publish und Subscribe von ionic-eckigen zu verwenden.Ionic 2: Aufrufende Ereignisse abonnieren und gleichzeitig abmelden

subscribe.js

this.events.subscribe('done:eventA', (userEventData) => { 
    //Perform some operations 
    this.startEventB(); 
    this.events.unsubscribe('done:eventA'); <--- 
} 

this.events.subscribe('done:eventB', (userEventData) => { 
    //Perform some operations 
    this.startEventA(); 
} 

this.events.subscribe('done:eventA', (userEventData) => { 
    //Perform some operations 
    this.startEventC(); 
} 

startEventB(){ 
    this.events.publish('done:eventB', data); 
} 

startEventA(){ 
    this.events.publish('done:eventA', data); 
} 

Die erste Zeit Ereignis A ist veröffentliche ich startEventB()
Die zweite Zeit Ereignis A ausgeführt werden soll, die ich startEventC() so versucht auszuführen veröffentlichen möchte ich unsubscribe aus dem ersten Teil.
Aber wenn ich unsubscribe bin, sind alle meine Abonnements weg.

Kann ich wissen, was eine gute Möglichkeit ist, Ereignisse zu abonnieren und abzubestellen?

Antwort

0

Wenn Sie dem Abbestellen keinen zweiten Parameter übergeben, sind alle Teilnehmer removed. Wenn Sie einen bestimmten Abonnenten abmelden möchten, müssen Sie das gleiche Objekt abonnieren und abbestellen, wie unter here erläutert.

Eine andere Lösung, die ich bevorzuge, ist es, einen Dienst zwischen den Komponenten zu teilen, die einen der RxJS-Subjekttypen haben. Die Quellenklasse kann unter Verwendung einer Dienstfunktion veröffentlichen, die als nächstes an dem Objekt vorgeht, und die Zielklasse kann den Strom beobachten, der das Subjekt als beobachtbar erhält.

Hier haben Sie ein Beispiel für diese Art von Dienstleistung:

import {Injectable} from '@angular/core'; 
import {Observable} from 'rxjs/Observable'; 
import {Subject} from 'rxjs/Subject'; 

import {Booking} from '../../common/model/booking'; 


@Injectable() 
export class BookingEventsService 
{ 
    private _newChannel: Subject<Booking> = new Subject<Booking>(); 


    constructor() 
    { 
    } 

    publishNew(booking: Booking) 
    { 
     this._newChannel.next(booking); 
    } 

    newChannel(): Observable<Booking> 
    { 
     return this._newChannel.asObservable(); 
    } 
} 

Hoffe, es hilft. Grüße, Xavi