2016-06-05 15 views
1

Wenn ich eine Array-Klasse wie diese:Holen einzelnes Mitglied aus einem Array von einem rxJS beobachtbaren

export class DashboardComponent { 
    people$: Observable<Person[]>; 
    selectedPerson$: Observable<Person>; 
    constructor(selectedPersonId){ 
     this.people$ = getSomeObservableArrayOfPeople();//gets the array in an observable from some source 

     // How to then selected the selected person from the array this.people??? 
    } 
} 

Wie gehe ich über ein Observable<Person[]> nehmen und dann die Person in eine beobachtbare auswählen (oder nur die rohen Wert, was auch immer die richtige Sache ist).

+0

Nicht sicher, was Sie fragen. Ihr Code zeigt 'Observable ', aber Sie fragen nach 'Observable '. Versuchen Sie, eines zu einem anderen zu konvertieren? – RoninCoder

Antwort

1

Nachdem ich weggegangen bin und zurück gekommen bin denke ich, dass ein Teil meiner Verwirrung nicht verstand, was die Observablen tatsächlich waren und wie es funktionierte.

Was ich versuchte zu tun, ist der Wert eines Arrays in einer beobachtbaren, so dass ich eine andere beobachtbare zurück bekommen konnte, die den Wert der ausgewählten Person hat. Der vollständige (semi-sudo-Code) wäre wie folgt:

import * as _ from 'lodash'; 

export class DashboardComponent { 
    people$: Observable<Person[]>; 
    selectedPerson$: Observable<Person>; 
    constructor(selectedPersonId){ 
     this.people$ = getSomeObservableArrayOfPeople();//gets the array in an observable from some source 
     this.selectedPerson$ = this.people$.map((people) => this.getSelectedPerson(selectedPersonId, people)); 

    }  
    getSelectedPerson(selectedPersonId, people){ 
     if(!(state || people.length == 0)) return null;  
     return _.find(people, function(r: Person) { return r.id === selectedPersonId; }); 
    } 
} 
+0

Es sieht etwas komisch aus, dass du 'this' an' getSelectedPerson (..., people) übergibst ', aber wenn du es auch für andere Dinge verwendest, könnte das in Ordnung sein. Es ist nicht offensichtlich, was '_find (...)' sein sollte. Es gibt kein _ im Geltungsbereich. Ich nehme an, Sie nennen dort 'subscribe()'. –

+0

Sie sind Corrent, es war seltsam in diesem Beispiel, es war in meinem Beispiel der realen Welt Ich wollte in der Lage sein, auf eine Klassenvariable mit this.selectedPerson zu verweisen, aber ich vereinfachte das in meinem Beispiel. Habe es jetzt aktualisiert. – sethreidnz

2

Ihre Frage ist ein wenig unklar daher eine etwas allgemeine Antwort:

Wenn Sie zu einer beobachtbaren abonnieren, die Arrays emittiert dann gibt es nichts anderes, ob man von einer beobachtbaren das Array erhalten oder nicht (zumindest, wenn Sie tatsächlich Ich habs).

die erste Person Um auf die beobachtbaren abonnieren und Zugriff nur das erste Element des Arrays wie

getSomeObservableArrayOfPeople().subscribe(data => this.person = data[0]); 

Wenn die beobachtbaren, aber sie nicht eine Reihe von Menschen emittieren eine Folge von Ereignissen von Menschen dann kann Betreiber wie

verwenden
getSomeObservableOfPeople().skip(3).take(1).subscribe(data => this.person = person); 

Dies dauert nur die vierte Person und ignoriert alle anderen.

Hinweis: Operatoren wie skip und take müssen explizit importiert werden, damit sie verfügbar sind.

Für Observablen, die eine Folge von Person Ereignisse emittieren, wie in dem obigen Beispiel angenommen wird, kann sich diese Sequenz wie unter Verwendung des scan Operator auf ein Array gesammelt werden:

getSomeObservableOfPeople().scan(3).subscribe(data => { 
    if(data.length >= 3) { 
    this.person = data[2]; 
    } 
}) 

Jedes Mal, wenn eine neue Person emittiert wird, die Der Rückruf, der an subscribe übergeben wird, wird mit dem Array aufgerufen, in dem die Personen, die von vorherigen Ereignissen emittiert wurden, mit der Person kombiniert werden, die vom letzten Ereignis ausgegeben wurde.

+0

Danke deine Antwort klärt einige Dinge. Ich habe mich unten für die eigentliche Frage geantwortet (die ich zugeben muss, war nicht 100% klar). Lass mich wissen, wenn etwas, das ich tue, falsch ist. Wenn nicht, dann markiere ich meine eigene Antwort als Antwort. – sethreidnz

Verwandte Themen