2014-10-28 34 views
0

此代碼是在KnockoutJS視圖模型:KnockoutJS:功能範圍錯誤

function myViewModel() 
{ 
    this.prop1 = ko.observable(123); 
    this.prop2 = ko.observable("Hello"); 
    .. 
    .. 
} 

myViewModel.prototype.func1 = function() 
    { 
    alert(this.prop1());    //works fine here 

     myTimer = setTimeout(function() 
     { 
      alert(this.prop1()); //this.prop1() raises an undefined error 
     }, 3000);     //from console: Uncaught TypeError: undefined is not a function 
}; 

爲什麼沒有財產的計時器回調中識別?看起來像一個範圍問題,但我似乎無法解決它。

回答

2

您應該閱讀約Javascript scopesthe var self = this idiomthis關鍵字在回調函數中可能會出現意外行爲,因爲它可能會設置爲意想不到的情況(如調用超時回調的函數或window或...)。

喜歡的東西*這將是一個立即解決您的問題:

myViewModel.prototype.func1 = function() 
{ 
    var self = this; 
    alert(self.prop1());    //works fine here 

    myTimer = setTimeout(function() { 
     alert(self.prop1()); 
    }, 3000);     
}; 

*「喜歡」這一點,因爲你的問題沒有代碼實際上重現你的問題。 repro會幫助你解決問題更有用

+0

你好Jeroen,並感謝一百萬;它做到了。你建議我在另一篇文章中閱讀JavaScript範圍,但遺憾的是,我沒有。我從來沒有完全理解self關鍵字。非常感謝你。 – iSofia 2014-10-28 08:09:17

+0

很高興幫助。即使你沒有時間閱讀它(這是一個密集的話題),只要記住始終用'var self = this;'開始你的視圖模型構造函數,並且在所有地方都使用'self'而不是'this',你將會倖免於難。 – Jeroen 2014-10-28 08:14:47

+0

我一定會那樣做。感謝您的提示和解決方案。你是一個拯救生命的人,Jeroen。 – iSofia 2014-10-28 08:39:26