2016-10-06 4 views
1

以下のコードを取得しています。プロパティ 'weatherData'がタイプ 'XMLHttpRequest'に存在しません。これは、天気をコンソールに出力することを想定しています。これにタイプスクリプト。パラメータ

class WeatherService { 
    public weatherData; 

    public getWeather(callback) { 
     let url = `http://api.openweathermap.org/data/2.5/weather?API=&APPID=d43debb0b9a3919fef3f0f689e82583e&q=${this.city}`; 
     let request = new XMLHttpRequest(); 
     request.addEventListener('load', function() { 
      // parse weather data from Ajax call 
      this.weatherData = JSON.parse(request.responseText); 
      // invoke callback to notify that we are done 
      callback(); 
     }) 
     request.open('GET', url); 
     request.send(); 
    } 

    constructor(private city: string) { } 
} 

// create instance of weather service for Seattle 
let service = new WeatherService('Seattle'); 

// invoke the service to get weather data for Seattle 
service.getWeather(() => { 
    console.log(service.weatherData); 
}); 
+0

は、あなたが本当に追加したいです'weatherData'をリクエストオブジェクトに送信しますか? 'request.addEventListener( 'load')'コールバックの 'this'は' WeatherService'クラスではなく 'request'を参照しているからです。 –

答えて

3

thisaddEventListenerコールバックでrequestですが、あなたはあなたのコールバック用の矢印関数の構文を使用してthisではなく、あなたのクラスのインスタンスになるようにすることをオーバーライドすることができます。

request.addEventListener('load',() => { 
    // parse weather data from Ajax call 
    this.weatherData = JSON.parse(request.responseText); 
    // invoke callback to notify that we are done 
    callback(); 
}) 
+0

'this'はそのクラスのクラスではなく' getWeather'メソッドを参照していませんか?彼が 'console.log'にしたいと思うように、彼はサービスクラスに' weatherData'を追加したいと思うようです。 –

+1

いいえ、 'getWeather'が' service.getWeather'として呼び出されるため、 'this'は' service'クラスのインスタンスになります。 – JohnnyHK

+0

ええ、矢印のメソッドは、おかげで再び完全に働いた。 –

関連する問題