2016-04-23 13 views
1

ここでは何がgongであるのかを理解しようとしています。関数を別の方法で呼び出します。ここで最初のエラーを生成します方法です:@InjectableコールバックはAngular2/Firebaseの "TypeError:this is undefined"を生成します

player.service.ts file

私は持っているが

private roomsRef: Firebase; 

constructor() { 
    this.roomsRef = new Firebase("https://xxx.firebaseio.com/rooms"); 
} 

postGameActions(roomId: string) { 
     console.log("post game actions start on " + roomId); 

//error on below 'this'   
     this.roomsRef.child(roomId).child("board").once("value", snap => { 
      let board = snap.val(); 
      //do stuff with 'board' object 
     }); 
} 

room.component.ts file

activateTimer(roomId: string, roomName: string, callback) { 
    var timer = setInterval(redirectTimer, 1000); 
    var seconds: number = 5; 
    var timerHtml = document.getElementById("divRedirectTimer" + roomName); 
    timerHtml.innerHTML = "[" + seconds + "]"; 

    function redirectTimer() { 
     timerHtml.innerHTML = "[" + (seconds--) + "]"; 
     if(seconds === 0) { 
      clearInterval(timer); 
      callback(roomId); 
     } 
    }; 
} 

call non-working version like this

activateTimer(room.id, room.name, _playerService.postGameActions) 

エラー:

EXCEPTION: TypeError: this is undefined 

Working version

このように立派に動作しますが、私が呼ぶとき、 'これは' 定義されていないのはなぜactivateTimer以来setInterval()のない使用は、単にサービスメソッド

room.component.ts file

activateTimer(roomId: string, roomName: string) { 
    var timer = setInterval(redirectTimer, 1000); 
    var seconds: number = 5; 
    var timerHtml = document.getElementById("divRedirectTimer" + roomName); 
    timerHtml.innerHTML = "[" + seconds + "]"; 

    function redirectTimer() { 
     timerHtml.innerHTML = "[" + (seconds--) + "]"; 
     if(seconds === 0) { 
      clearInterval(timer); 
     } 
    } 

    this._playerService.postGameActions(roomId); 

call working version like this

activateTimer(room.id, room.name) 

を呼び出していませんコールバックとしてpostGameActions?私はあなたが矢印関数に呼び出しをラップする必要が

+0

もう一つの方法は、bindメソッドを使用するのでしょうか? –

答えて

2

ここに簡単な何かが欠けていると確信している:

activateTimer(room.id, room.name,() => { 
    _playerService.postGameActions(); 
}); 

あなたのコード内の問題は、あなたがオブジェクトを失うので、あなたが直接関数を参照ということですそれが実行されます。 activateTimerが呼ばれる方法

activateTimer(room.id, room.name, _playerService.postGameActions.bind(_playerService); 
関連する問題