2017-04-13 17 views
0

setInterval()によって呼び出されるtimed関数の内部から関数を呼び出そうとしています。ここでTS TypeScript SetInterval - タイマターゲット関数の内部から関数にアクセスできない

は私のコードです:

export class SmileyDirective 
{ 

FillGraphValues()  
{ 
    console.log("FillGraphValues works");  // this works 
} 

MyTimer() 
{ 
    console.log("timer works");  // this works 
    this.FillGraphValues();   // this does not work 
    FillGraphValues();    // this does not work 
} 

draw() 
{ 
    this.FillGraphValues(); // this works 

    setInterval(this.MyTimer, 1000); 
} 
} 

アプリケーションのいずれかでクラッシュ:

"this.FillGraphValues is not a function" 

または

Cannot find name 'FillGraphValues'. Did you mean the instance member 'this.FillGraphValues'? 

私も試してみました:

setInterval(function(){MyTimer()}, 1000); 

setInterval(function(){this.MyTimer()}, 1000); 

しかし、彼らは動作しませんでした。

感謝:)

+0

'this.FillGraphValues(); //これは動作しません.' setIntervalコールバック内のMyTimer()の呼び出しを意味しますか? –

+0

試してみる 'this.myTimer.bind(this)' 'setTimeout/setInterval'は指定された時刻にイベントを登録するだけなので、コンテキストが失われる – Rajesh

+6

[コールバック内の正しい\' this \ 'にアクセスする方法] (http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-inside-a-callback) – Rajesh

答えて

0

たぶんこれがうまくいく: たsetInterval(()=> {this.MyTimer()}、1000)。

ので、コードは次のようになります。

export class SmileyDirective { 

    FillGraphValues() { 
     console.log("FillGraphValues works");  // this works 
    } 

    MyTimer() { 
     console.log("timer works");  // this works 
     this.FillGraphValues();   // this DOES work 
    } 

    draw() { 
     this.FillGraphValues(); // this works 

     setInterval(() => { this.MyTimer() }, 1000); 
    } 
} 

var obj = new SmileyDirective(); 
obj.draw(); 

これはきれいにtranspiles:注目すべき部分は

var _this = this; 
 
      this.FillGraphValues(); // this works 
 
      setInterval(function() { _this.MyTimer(); }, 1000);
ある

define(["require", "exports"], function (require, exports) { 
 
    "use strict"; 
 
    var SmileyDirective = (function() { 
 
     function SmileyDirective() { 
 
     } 
 
     SmileyDirective.prototype.FillGraphValues = function() { 
 
      console.log("FillGraphValues works"); // this works 
 
     }; 
 
     SmileyDirective.prototype.MyTimer = function() { 
 
      console.log("timer works"); // this works 
 
      this.FillGraphValues(); // this does not work 
 
     }; 
 
     SmileyDirective.prototype.draw = function() { 
 
      var _this = this; 
 
      this.FillGraphValues(); // this works 
 
      setInterval(function() { _this.MyTimer(); }, 1000); 
 
     }; 
 
     return SmileyDirective; 
 
    }()); 
 
    exports.SmileyDirective = SmileyDirective; 
 
    var obj = new SmileyDirective(); 
 
    obj.draw(); 
 
});

本質的に閉鎖でこの変数を保存したsetInterval関数を呼び出すときにそれを使用してコンテキストを保存210

+1

実際にコードを投げるのではなく、OPの機能範囲を説明する時間を取っているはずですそれら。 –

+0

私は同意します....今更新しています – Digvijay

関連する問題