2016-10-06 19 views
1

サブスクリプション内の変数は未定義ですが、サービスをサブスクライブする前にブレークポイントを置くと、変数が定義されます。サービスでRxJS subscribe()関数内のコンポーネント変数は定義されていません

:コンポーネントで

getCashierRiskProfiles(): Observable<ICashierRiskProfile[]> { 
    return this.http.get(this._baseUrl + "src/HTTPJson/cashierriskprofile.json") 
     .map((res: Response) => res.json()) 
     .catch((error: any) => Observable.throw(error.json().error || 'Server error')); 
} 

import { Component, OnInit} from "@angular/core"; 
import { CashierRiskProfileService} from "./cashierriskprofile.service"; 
import { ICashierRiskProfile} from "../shared/interfaces"; 
import { Observable } from 'rxjs/Observable'; 

    @Component({ 
      selector: "cashierriskprofile", 
      templateUrl: "../src/app/cashierriskprofile/cashierriskprofile.component.html" 
      }) 

    export class CashierRiskProfileComponent implements OnInit { 
      filterText : string; 
      cashierRiskProfiles: ICashierRiskProfile[]; 

     constructor(private sorter: Sorter, 
       private service: CashierRiskProfileService) { 

      } 

     ngOnInit() { 
       this.filterText = "Filter Exceptions:"; 
       //// Observable technique 
       this.service.getCashierRiskProfiles() 
        .subscribe((riskProfiles) => { 
        this.cashierRiskProfiles = riskProfiles; 
        this.filterText = "Inside Subscribe:"; 

        }, 
        err => { 
         // Log errors if any 
         console.log(err); 
        }); 
      } 

上記部品コードでngonInit()サービスコール、内部の購読内部this.cashierRiskProfilesは定義されていませんが、私は前にブレークポイントを入れた後、サービスコールには、その変数が使用可能で定義されています。私はこの問題を持つ多くの人々がthis.variablename getttingで定義されていないコンポーネント変数を見てきました。 this.filterTextに気付くと、dataserviceコールの外に割り当てられた値を取得できますが、subscribe内にブレークポイントを入れると、this.filterTextはどのように失われているのかわかりません。誰もが何が起こっているの解決策を提供できますか?

+0

それは、スコープに関係しています。あなたができることの1つは、結果( 'riskProfiles')をプライベートメソッドに渡し、そこに必要なロジックをすべて処理することです。 '.subscribe((riskProfiles)=> this.methodToProcessResponse(riskProfiles))'のようなものです。次に、 'methodToProcessResponse()'メソッドで何をする必要があるかを行います。 –

+0

@DaveVありがとうございましたが、変数にデータを割り当てる方法を追加するために余分な作業をすべて行う必要がありますか?これは、角度とrxjsのバージョンが更新されるまでうまく機能していました。これは、余分なメソッドを追加する唯一の回避策であり、サブスクリプション内でその変数を使用できるようにコードで行うことができる実際の修正です。 –

+0

@DaveVこのメソッドを実装しても、私のUIにバインドされていないデータが表示されます。オブジェクトが利用可能になるまで待つことはありません。 UIには、正常に動作していないオブザーバがあり、サブスクリプション内でコンポーネント変数にアクセスすることはできません。 –

答えて

0

あなたのコードはよかったです。私は、実行時に、これは内部のサブスクライブからだと推測とにかくあなたが次のことを試してみて、それがうまく

ngOnInit() { 
    this.filterText = "Filter Exceptions:"; 
    this.populateCashierRiskProfiles(); 
} 

populateCashierRiskProfiles() { 
    //// Observable technique 
    this.service.getCashierRiskProfiles() 
     .subscribe((riskProfiles) => { 
      this.cashierRiskProfiles = riskProfiles 
     }); 

} 
+0

ありがとうございます、購読内でも、コンポーネントレベルで宣言したthis.xyzのような一般的な変数を入れようとしましたが、subscribe変数wierd内のその変数にアクセスできませんでした。この問題は修正できませんでしたが、私はその変数にアクセスすることができます: this.service.getUsers() .then((users:IUser [])=> { this.users = users; }); –

2

を動作するかどうか私に知らせることができている私のプロジェクトで同じアプローチを、以下、私のために

を正常に動作していますSafeSubscribe、あなたのコンポーネントではありません。

使用の閉鎖は、このように、コンポーネントのメソッドを呼び出すには:

populateCashierRiskProfiles() { 
    const that = this; 
    //// Observable technique 
    this.service.getCashierRiskProfiles() 
     .subscribe((riskProfiles) => { 
      that.cashierRiskProfiles = riskProfiles 
     }); 
} 
関連する問題