2017-08-05 4 views
1

Typescriptが新しく、それを頭に浮かべようとしています。Typescript関数で変数を渡します。

以下は、基本的に3つの乱数を生成するコードであり、それらを使用してjsonからランダムオブジェクトを選択します。

@Injectable() 
export class TrackService { 
    public drawn :number[]=[]; 

    constructor(private http: Http) { 


    } 
    public getRandomTrack(): Observable<Track[]> { 
     this.generateRandomNumbers(); 
     console.log(this.drawn); //this.drawn is available here 
     return this.http 
     .get(API_ENDPOINT) 
     .map(this.extractRandomData); 
    } 



    public extractRandomData(res: Response) { 
     let body = res.json();   
     console.log(this.drawn); //undefined here 

     var randomTrack = []; 

     for(var i=0;i<this.drawn.length; i++){ 
      randomTrack.push(body.results[this.drawn[i]]); 
     } 

     return randomTrack; 
    } 


    private generateRandomNumbers(){ 
     var available = []; 

     for (var i = 1; i<= 55; i++) { 
      available.push(i); 
     } 

     for (var i = 0; i <3; i++) { 
      var random = Math.floor((Math.random() * available.length)); 
      this.drawn.push(available[random]); 
      available.splice(random, 1); 
     } 

     return this.drawn; 
    } 

あなたはextractRandomDataのthis.drawnの内部を見ると、私はその配列にアクセスすることができますので、私はその機能にthis.drawnを通過しないか、定義されていません。

助けてください。

答えて

1

あなたはコンテキストをバインドする必要があります。

public getRandomTrack(): Observable<Track[]> { 
    this.generateRandomNumbers(); 
    console.log(this.drawn); //this.drawn is available here 
    return this.http 
    .get(API_ENDPOINT) 
    .map((v) => { this.extractRandomData(v) }); 
} 

は、より多くの詳細については“this” cannot be used in typescript function (Angular) を参照してください。

+0

こんにちはマクシムスのおかげ詳細はこのリンクを参照してください !私の無知を許して、ここでv何ですか? – Spdexter

+0

これは単なる値を保持する変数です –

1

私はそれが最後で、このどのように良いか悪いかの

https://www.tutorialspoint.com/typescript/typescript_array_map.htm

public getRandomTrack(): Observable<Track[]> { 
     this.generateRandomNumbers(); 
     console.log(this.drawn); 
     return this.http 
     .get(API_ENDPOINT) 
     .map(this.extractRandomData,this); 
    } 

の考えを、これを追加することにより、作業ですか?

1

あなたがサービス内でいつでもあなたがそれにアクセスできるように引かれた配列は、あなたのサービスのグローバルですが、あなたの問題は、マップの呼び出しである、あなたは以下のように呼び出す必要があります:

return this.http.get(API_ENDPOINT) 
      .map(responseData => this.extractRandomData(responseData)); 
0

あなたはのいずれかを使用することができます上記の答え。どちらも正しいです。 this is undefined in map

サンプルコード

public getRandomTrack(){ 
    this.generateRandomNumbers(); 
    console.log(this.drawn); 
    [1,2].map(this.extractData,this); //Pass this as argument 
    [1,2].map(data => {    // Arrow function 
    console.log(this.drawn); 
} 

extractData(val : any){ 
    console.log(val); 
    console.log(this.drawn); 
} 
関連する問題