2017-08-25 2 views
0

私は論理的な問題を抱えています。それは工場のパターンの一部です(私は期待しています)?オブジェクトがインスタンス化されていない間にobservableを送信します

問題は次のとおりです。 -Iパラメータ 'p'を持つクラス 'Cl'があります。 - 'Cl'コンストラクタで、私はpの正しい値を取得するためにhttpリクエストを行います(この部分も非常に奇妙です)。 -'Cl 'は' p 'またはその一部を返すgetterを持っています。

私がしたときinstance = new CL(); instance.get();私のhttpリクエストはまだ完了していません。したがって 'p'は定義されていません。 ゲッターは、pが定義されているときにのみ受け入れられる観測値を返すことができますか?

import {lot of thigs } from '@angular/core'; //and RxJs 

@Component({ 
//... 
}) 
export class aClass { 
private p:any 

constructor() { 
    this.p = return this.Http.get('a/route')//let's say this request take AGE 
    .map((response) => { 
     return response.json(); 
    }); 
} 

//Obviously no working cause cause p isn't "define yet" 
public getP(index){ 
    return this.p[index]; 
} 

//I'd hope something like this would work but it doesn't. 
public getObservableP(index): Observable<any>{ 
    return Observable.of(this.p[index]); 
} 

} 

あなたはどのようにpがインスタンス化してくださいときに果たしていきますどの観察可能(または約束、それがあるべき場合)を返すように教えてもらえます:

は、おそらくいくつかのコードは、より良い状況を説明します。ありがとう。

(私はconstuctorのhttpリクエストについていくつかのことを読んでいますが、私の考えは間違っているかもしれません)。

+0

すべての約束の最初に、あなたのテンプレートたちにして非同期ですか。約束が完了したかどうかを確認する。 約束を保存しようとします。 this.p =レスポンス。 そして、3番目に、これを手に入れよう。 – Swoox

+0

@Swoox申し訳ありませんが、私は二度読んでいますが、私はこれを理解していません。 – ssbb

+0

存在しないオブジェクトを返そうとします。あなたのアプリケーションがあなたの約束よりも速いからです。 – Swoox

答えて

1

コードがサービスとして動作を投稿した場合、最善のことは、このような非同期パイプを利用することですが:あなたのコンポーネントで

import {lot of thigs } from '@angular/core'; //and RxJs 

@Component({ 
//... 
}) 
export class aClass { 
private p:any 

constructor() { 
    this.p = return this.Http.get('a/route')//let's say this request take AGE 
    .map((response) => { 
     return response.json(); 
    }); 
} 

public getP(index){ 
    return this.p; 
} 
} 

あなたがAClassはを注入し、テンプレート内になります。

<div *ngFor="let something of aClass.getP() | async"> 
    {{something}} 
</div> 

または

<p>{{aClass.getP() | async}}</p> 
+0

を理解しようとするものですが、それはうまくいくと思います。 ゲッターをテンプレートに入れるのではなく、非同期にする方法を知っていますか? – ssbb

+0

(私が書いたように)オブザーバブルを返す必要があります。次に、コンポーネントコードでそれを使用してコンポーネントコードを購読することができます。 'aClass'サービスを注入するコンポーネントがあり、サービスがあなたのobservableを返すgetPメソッドを持っているとしましょう。あなたのコンポーネントでは、 'this.aClass.getP()。subscribe((result)=> result);'を書くことができます。サブスクライブブロックでは、結果を変数に保存したり、フィルタリングしたりできます。 – Matsura

関連する問題