2014-10-28 70 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