2016-05-25 15 views
1

Ich werde versuchen, dies so gut ich kann zu erklären.Angular2 Anrufbeobachter nächste von Kind Objekt

Ich habe einen Dienst, der eine beobachtbare Klasse enthält, die Aufgaben ausführt, um sich selbst zu aktualisieren. Diese beobachtbare Klasse muss mithilfe des Beobachters, der sich im Dienst befindet, in die App verschoben werden. Wie kann ich diesen Beobachter vom Kind aus aufrufen, ohne eine Art Abhängigkeitsschleife zu erzeugen?

Hier ist ein einfaches Beispiel:

class MyService { 
    subClass$: Observable<SubClass>; 
    _subClassObserver: Observer<SubClass>; 

    constructor(private _subClassStore: SubClass){ 
    this.subClass$ = new Observable(observer => { 
     this._subClassObserver = observer 
    }).share(); 
    } 

    pushData(){ 
    this._subClassObserver.next(this._subClassStore) 
    } 
} 

class SubClass { 
    displayData: string; 
    displayData2: number; 

    constructor(){ 
    socket.on('setData', function(obj){ 
     this.displayData = obj.dd1; 
     this.displayData2 = obj.dd2; 
     //How to call pushData() in MyService from here to push data to app? 
    } 
    } 
} 

_subClassStore durch einen Stream aktualisiert in von socket.io kommen. Wie kann ich MyService wissen lassen, wenn sich die SubClass-Daten ändern, sodass sie es mit _subClassObserver.next (_subClassStore) pushen kann?

EDIT: Ich fügte weitere Details zu dem obigen Beispiel hinzu, um zu zeigen, wie sie verwandt sind und verwandt werden.

SubClass ist nur ein Listener für einen Datenstrom, der von socket.io kommt und die Informationen in der Klasse speichert. Es beginnt zu hören, wenn MyService erstellt wird.

Das Ziel von MyService besteht darin, eine Reihe von Subklassen bereitzustellen, die in der ganzen App abonniert werden können. Jeder würde den Zugriff auf einen anderen Datenstrom und die zugehörigen Daten erlauben, aber alle wären in einem einzigen Dienst enthalten.

Die Frage ist, wie die pushData() - Funktion im übergeordneten Element aufgerufen wird, damit der Stream für Abonnenten in der App aktualisiert wird.

Edit 2:

Dies könnte helfen. unten ist, wie es als ein Dienst ohne die Unterklasse geschrieben wäre. Der einzige Grund, warum ich das nicht mache, ist, dass es eine große Menge dieser Zuhörer in Observables speichert und sie in Klassen abstrahiert. Das macht die Informationen viel einfacher zu managen, aber es in die App zu schieben ist was ich nicht kann out:

class MyService { 
    class1$: Observable<DataStream>; 
    _class1Observer: Observer<DataStream>; 
    _class1Store: DataStream; 

    constructor(){ 
    this._class1store = {displayData: 'hello', displayData2: 0}; 

    this.class1$ = new Observable(observer => { 
     this._class1Observer = observer 
    }).share(); 

    socket.on('setData', function(obj){ 
     this._class1Store.displayData = obj.dd1; 
     this._class1Store.displayData2 = obj.dd2; 
     this._class1Observer.next(this._class1Store) 
    } 
    } 

interface DataStream = { 
    displayData: string; 
    displayData2: number; 
} 
+0

ich Ihnen mehr Kontext bieten erraten müssen, wie diese Komponenten in Zusammenhang stehen. –

+0

Ich habe ein bisschen mehr Informationen zur Verfügung gestellt. Dies könnte ein wenig zu kompliziert sein, um es ohne ein substanzielles Codebeispiel zu erklären. Wenn es also keinen Sinn ergibt, lass es mich wissen und ich werde es löschen, um andere nicht zu verwirren. – BrentShanahan

Antwort

1

Statt function(obj) Verwendung ()=> sonst this wird nicht auf die MyService Instanz Ponit.

constructor(){ 
    socket.on('setData', (obj) =>{ 
     this.displayData = obj.dd1; 
     this.displayData2 = obj.dd2; 
     //How to call pushData() in MyService from here to push data to app? 
    } 
    } 

Ich bin nicht sicher, aber ich denke, socket anfällig ist außerhalb winkelförmigen Stangen Zone zu laufen. Versuchen Sie auch

constructor(zone:NgZone){ 
    socket.on('setData', (obj) =>{ 
     zone.run(() => { 
     this.displayData = obj.dd1; 
     this.displayData2 = obj.dd2; 
     //How to call pushData() in MyService from here to push data to app? 
     }); 
    } 
    } 

Um ein Verfahren in MyService von SubClass nennen, SubClass muss einen Verweis auf MyService

class MyService { 
    subClass$: Observable<SubClass>; 
    _subClassObserver: Observer<SubClass>; 

    constructor(private _subClassStore: SubClass){ 
    _subClassStore.myService = this; 
    this.subClass$ = new Observable(observer => { 
     this._subClassObserver = observer 
    }).share(); 
    } 

    pushData(){ 
    this._subClassObserver.next(this._subClassStore) 
    } 
} 

class SubClass { 
    displayData: string; 
    displayData2: number; 
    myService:MyService; 

    constructor(zone:NgZone){ 
    socket.on('setData', (obj) =>{ 
     zone.run(() => { 
     this.displayData = obj.dd1; 
     this.displayData2 = obj.dd2; 
     this.myService.pushData(); 
     }); 
    } 
    } 
} 
+0

Erstellt MyService referierende SubClass und SubClass, die MyService referenzieren, nicht eine Endlosschleife? Oder stellt es nur den Verweis auf die Klasse und nicht eine Instanz der Klasse zur Verfügung. Dh eine Schleife würde nur erstellt werden, wenn sie sich gegenseitig einer Variablen zuordnen würden?Beispiel: Das übergeordnete Element, das eine untergeordnete Instanz erstellt, die eine übergeordnete Instanz erstellt, wird wiederholt. – BrentShanahan

+0

Das Erstellen einer Schleife auf diese Weise verursacht keine Probleme. Es würde beispielsweise Probleme verursachen, wenn DI die Schleife auflösen müsste, die nicht unterstützt wird (wenn 'MyService' in Konstruktorparametern' SubClass' erfordert und 'SubClass' in Konstruktorparametern' MyService' erfordert). –

+0

Super, danke für die Info! – BrentShanahan

Verwandte Themen