2015-11-13 57 views
0

我正在探索開源開發和使用yeoman和淘汰賽發電機與十字路口和requirejs。我已經看過ES6類和構造函數,並且我並不完全理解在某些情況下,在可見性不是ES6類或函數模式中發生的函數錯誤的情況下,敲除操作會發生什麼。所以我以前在淘汰賽中已經看到過這種行爲,但是如果可以的話,我想要一些額外的細節。淘汰賽觀察不是一個函數錯誤

一個codepen這裏的這種行爲:http://codepen.io/srabeeh/pen/pjqweX?editors=001

有人能解釋失敗的功能查找的來源是什麼? 代碼:

class Circle { 
    constructor(diameter, quality) { 
     this.diameter = ko.observable(diameter); 
     this.quality = ko.observable(quality); 
    } 

    updateCircle(){ 
    console.log('updating...'); 
    // the correct way to update an observable 
    // this line fails with diameter is not a function - uncomment to see error 

    // this.diameter(this.diameter() +1); 

    // this works but i fear this obliterates the observable 
    this.diameter += 1; 

    console.log(this.diameter); // gives NaN of course as it's an observable 

    //function call fails that it's not a function 
    console.log(this.diameter()); 

    } 

    startTimer(){ 
     var timer = setInterval(this.updateCircle, 1000) 
    } 
}; 

let c = new Circle(270, 5); 
c.startTimer(); 

感謝

+0

你檢查過這個指針是否在updateCircle方法中正確嗎?否則你可能需要綁定它。 – Tarion

+0

偏離主題,但這是什麼樣的你和你不明白和不需要的東西?擺脫所有的煩惱,並從基礎開始。不要惹你不明白的東西。如果你不理解它,你不需要它。除非你明白它是什麼,並認識到你的需要,否則不要使用某些東西。不要一下子試試一切。分解它,並一次採取一件事。在進入ES6,requirejs和yoeman之前,瞭解自己的淘汰賽,以及這個十字路口的東西是什麼?我從來沒有聽說過它。 – hasen

回答

0

它實際上是與這個指針的問題。試試這個:

class Circle { 
    constructor(diameter, quality) { 
    this.diameter = ko.observable(diameter); 
    this.quality = ko.observable(quality); 
    } 

    updateCircle() { 
    console.log('updating...'); 
    this.diameter(this.diameter() + 1); 
    console.log(this.diameter()); 

    } 

    startTimer() { 
    var timer = setInterval(function() { 
     this.updateCircle() 
    }.bind(this), 1000) 
    } 
}; 

let c = new Circle(270, 5); 
c.startTimer(); 
console.log("started") 

注意綁定。

+0

我記得這個問題。再讀一遍「this」和「bind」。好奇,有沒有辦法給updateCircle()方法正確的上下文或綁定「this」而不更改計時器?例如「var self = this;」?這是一個好的模式還是bind()是更審慎的方法? –

+0

是的。因爲lambda語法總是保留這種狀態,所以找出如何查看typecript編譯setInterval(()=> {this.doStuff()}),1000)的方法。 - 當然還有許多關於「這個」問題的其他資源。我個人喜歡堅持像所有我的js代碼打字稿一樣的transpile。 – Tarion