2017-02-11 5 views
1

マイコード:活字体 'この' スコープ問題

export class WordService { 
    constructor(private http:Http, private storage:Storage){} 
    impulseData={ 
     get():Promise<any>{ 
      return this.storage.get('impulseData'); 
     } 
    }; 
} 

私はmyWordService.impulseData.get()を呼んで、私はthis.storageundefinedで見つかりました。だからstorageimpulseData.getにどのようにアクセスできますか?

この問題は、有効範囲がthisであると思われます。たぶん私は、impulseData内と外のthisが同じスコープを共有するようにする必要がありますか?

更新:Suren Srapyanの答えに

おかげで、私は最終的にこれに私のコードを変更します。

impulseData={ 
    get:()=>{ 
     return this.storage.get('impulseData'); 
    } 
}; 

答えて

4

thisstorage性質を持っていないget()機能のコンテキストを指します。

あなたはarrow functions

export class WordService { 
    constructor(private http:Http, private storage:Storage){} 
    impulseData = { 
     get:(): Promise<any> => { 
      return this.storage.get('impulseData'); 
     } 
    }; 
} 

を使用するか、外部のthisを取得し、コンストラクタでオブジェクトを作成しようとすることができます。この場合でも、オブジェクトはthisに添付する必要があります。これは、コンストラクタ内でスコープされ、thisに接続されていないと、その外側には表示されないためです。

export class WordService { 
    impulseData; 

    constructor(private http: Http, private storage: Storage) { 
     const context = this; 
     this.impulseData = { 
      get(): Promise<any> { 
       return context.storage.get('impulseData'); 
      } 
     }; 
    } 
} 

それとも、あなたがthisなしのコンストラクタパラメータを使用することができます。この場合、コンストラクタ

+0

アロー機能を使用する必要があります!ありがとうございました。 – awmleer

0

で作成する場合は、のみstorage.get('impulseData')を使用することができます。

constructor(private http:Http, private storage:Storage){ 
    impulseData = { 
    get():Promise<any>{ 
     return storage.get('impulseData'); 
    } 
    }; 

そうでない場合は、ローカル変数に働い

constructor(private http:Http, private storage:Storage){ 
    let self = this; 
    impulseData={ 
    get():Promise<any>{ 
     return self.storage.get('impulseData'); 
    } 
    };