2017-01-09 3 views
0

Ich benutze NgRx in meiner angular2-Anwendung. Allerdings habe ich Schwierigkeiten, die Suchmethode auf meinem Observable zu verwenden.Finden Methode funktioniert nicht auf RxJs Observable

Die Übersetzungen für meine Anwendung stammen von einer externen Anwendung über Rest und werden im NGRX-Speicher als Schlüsselwertobjekt gespeichert. Dieses Objekt hat eine Schlüsselvariable mit dem Code und eine Übersetzungsvariable.

Wenn ich versuche, die Find-Methode zu implementieren, um das richtige Übersetzungsobjekt zu finden, funktioniert es nicht.

@Pipe({ 


name: 'translate', 
}) 
export class TranslatePipe implements PipeTransform, OnInit { 

    uiMessages$ = this.sb.uiMessages$; 

    constructor (private sb: AppSandbox) {} 

    transform(value: string, args: any[]): any { 
    return this.uiMessages$.find((uiMessage: UiMessage) => (uiMessage.key === value)).translation; 
    } 

Weiß jemand, was ich falsch mache?

Dank

Antwort

0

Unter der Annahme, dass uiMessages$ ein beobachtbar ist, Sie .find nicht nur können ein Objekt verwenden und erwarten, als find ein rxjs-Betreiber und rxjs-Betreiber ist immer eine beobachtbare zurück.

Was könnten Sie tun, ist:

transform(value: string, args: any[]): any { 
    return this.uiMessages$ 
     .switchMap((uiMessages: UiMessage[]) => Observable.from(uiMessages)) 
     .find((uiMessage: UiMessage) => (uiMessage.key === value)) 
     .map((uiMessage: UiMessage) => uiMessage.translation); 
} 

und verwenden Sie dann den async -pipe zusätzlich:

<div>{{'foo' | translate | async}}</div> 
+0

Ich verstehe, aber bekomme ich die Fehler Eigenschaft Fund nicht auf Typ existiert ‚beobachtbar ". Irgendwelche Ideen? – Ronny176

+0

Ja, das ist im Grunde, was ich in meiner Antwort erklärte: '.find' wird zurückgeben ein Observable, wenn Sie das zu einem einfachen Objekt (oder String) zuordnen möchten, müssen Sie entweder' async' pipe gehen (die ist der sicherste Weg btw.) oder eine Art Syncronouse Readout (was extrem hässlich ist) zu implementieren, was nur möglich wäre, wenn man 100% sicher sein kann, dass 'uiMessages $ 'keine asynchronen Flüsse enthält. – olsn

+0

Nur als Randnotiz, es gibt fertige Lösungen für die Übersetzung-Behandlung in angular2, nur für den Fall, dass das ist, was Sie erreichen möchten: https://github.com/ocombe/ng2-translate – olsn