2017-01-09 10 views
0

私はangular2アプリケーションでNgRxを使用しています。しかし、私はObservableでfindメソッドを使うのが難しいです。findメソッドがRxJsで動作しないObservable

私のアプリケーションの翻訳は、安心して外部アプリケーションから来ており、NGRXストアにキー値オブジェクトとして格納されています。このオブジェクトには、コードと翻訳変数のキー変数があります。

正しい変換オブジェクトを見つけるためにfindメソッドを実装しようとすると、機能しません。

@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; 
    } 

誰かが間違っていることを知っていますか?

おかげ

答えて

0

uiMessages$が観察されると仮定すると、あなただけのfindがrxjs-演算子であり、rxjs-事業者は、常に観察可能に戻りますよう、.findを使用してオブジェクトを期待することはできません。あなたは何ができるか

は次のとおりです。その後、

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); 
} 

、さらにasync -pipeを使用します。

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

私が理解し、しかし、私は「errorプロパティの検索がタイプに存在しません取得観察可能 '何か案は? – Ronny176

+0

はい、それは基本的に私が私の答えで説明したものです。 '.find'はObservableを返します。もしそれを普通のオブジェクト(または文字列)にマップしたい場合は、' async'パイプ'uiMessages $ 'に非同期フローが含まれていないことが100%保証されている場合にのみ可能となる、ある種のsyncronouseの読み出し(これは非常に醜い)を実装します。 – olsn

+0

ちょうど副メモとして、あなたが達成したいと思うような場合に備えて、angular2の翻訳処理のためのすぐに使えるソリューションがあります:https://github.com/ocombe/ng2-translate – olsn

関連する問題