2016-09-06 11 views
4

私はサーバーから取得したデータを処理する角パイプ2 RC5のカスタムパイプを実装しました。私が抱えている問題は、サーバが呼び出されたところのngOnInitの前にパイプが実行されることです。ngOnInitの前に実行されている角2パイプ

テストでは、すでにパイプが挿入されているリストをパイプに渡し、すべてが期待通りに機能します。唯一の問題は、ページがレンダリングされたときにPipeが実行されることです。そしてその場合のリストは空です。

ページのレンダリングを遅延させて、パイプが実行されたときにサーバーからデータが取得されるようにする方法はありますか?

これは私のコードのサンプルです:

コンポーネント

ngOnInit() { 
    Observable.forkJoin([ 
     this.testService.get(), 
     this.multilingualService.get(localStorage.getItem('currentPage')) 
    ]).subscribe(servicesResult => { 
     this.mainList = servicesResult[0]; 
     this.pageMultilinguals = servicesResult[1]; 
    }, 
    error => this.handleError(error)); 
} 

パイプ

@Pipe({name: 'multiLang'}) 
export class MultilingualPipe implements PipeTransform { 
    transform(value: string, pageMultilinguals: Multilingual[], context: number): string { 

     for (let i = 0; i < pageMultilinguals.length; i++) { 
      if (pageMultilinguals[i].reference === value && pageMultilinguals[i].contexTypeId === context) { 
       return pageMultilinguals[i].value; 
      } 
     } 
    } 
} 

テンプレート

<span>{{ 'Test' | multiLang: pageMultilinguals: 9 }}</span> 
+0

私はあなたの場合には、渡された値がnullているときに例外が発生しないようにだけnull値のためのパイプを安全にするために十分であるべきだと思いますあなたのパイプで、単にその場合の元の値を返すだけですか? – rook

+0

私はちょうどテンプレートに簡単な例を入れます。これは多言語リファレンスのため、 'Page_Header_1'という参照を持つことができ、その値を取得することができます。 –

答えて

3

Angularランが検出を変更すると、パイプが最初に実行されます。最初の変更検出実行後、ngOnInit()が呼び出されます。 ngOnInit()までの呼び出しをパイプに遅らせることは、まったく役に立ちません。なぜなら、サーバーコールをngOnInit()にすると、すぐに応答が得られるわけではないからです。 HTTP要求は非同期呼び出しであり、応答は最終的に来ますが、ngOnInit()はすでに長い時間が完了しています。あなたは空のデータのチェックを追加することはでき

@Pipe({name: 'multiLang'}) 
export class MultilingualPipe implements PipeTransform { 
    transform(value: string, pageMultilinguals: Multilingual[], context: number): string { 
     if(!value || !pageMultilinguals || !context) { 
      return null; 
     } 
     for (let i = 0; i < pageMultilinguals.length; i++) { 
      if (pageMultilinguals[i].reference === value && pageMultilinguals[i].contexTypeId === context) { 
       return pageMultilinguals[i].value; 
      } 
     } 
    } 
} 
+0

あなたの答えをありがとう。したがって、ページが読み込まれたときにデータが必要な場合、サーバーからデータを「待機」しているパイプは実際にはわかりません。私の場合、私はいつもデータを持つ必要があるので、私のアプローチを少し変える必要があるかもしれないと思います。 –

+0

ちょっと説明するために、これは私が翻訳可能な用語を持つために私がテストしていた小さな機能です。パイプの仕事は単に参照を渡すことであり、選択した言語のテキストが返されます。私は "ページ用語" ngOnInitを取得しようとしていましたが、あなたが指摘したように、パイプを "遅延"させてデータを待つことはできません。 –

+1

私はまだこれがあなたのトラブルを引き起こす理由は分かりません。パイプは、Angular2の変更検出が変更を検出すると(デフォルト)、変更検出が実行されるたびに(不完全なパイプの場合)呼び出されたものとみなされます。 –

関連する問題