2015-04-05 42 views
0

我很难理解如何在由$ interval调用的函数内处理值赋值。

鉴于以下代码:

this.value = null; 
this.setSelection = function() { 
    this.value = Math.floor(Math.random()*11); 
}; 
this.isSelected = function(item) { 
    if(this.value === item) { 
     return "selected"; 
    } 
}; 

如果我打电话以这种方式$interval(this.setSelection, 2000);函数被称为所定义的间隔中的为setSelection,但是所分配的值的范围似乎是,使得实际this.value没有改变,当摘要调用isSelected时,值仍然是null

但是,如果我直接调用该函数(如不正确的形式)$interval(this.setSelection(), 2000);值正确更新并且摘要运行isSelected它会识别新值。很明显,由于$interval预计会有函数参考,因此间隔不会再次运行。

我也试过在匿名函数中包装函数调用,但是这导致了一个错误,指出函数未定义。

所以我的问题是,为什么当我的函数被$ interval正确调用,我得到这个意外的结果?

回答

2

this取决于上下文。当致电$interval(this.setSelection, 2000)时,您将丢失this的上下文。该方法只是作为一个函数被调用。当正在执行this.value = ...时,this与您所期望的完全不同(可能是包含的函数)。来解决这个

的一种方法是一个简单的解决方法:

this.value = null; 
var self = this; 
this.setSelection = function() { 
    self.value = Math.floor(Math.random()*11); 
}; 

另一种解决方案是将功能结合this

$interval(this.setSelection.bind(this), 2000) 
+0

有趣。我认为this应该在上下文中,因为$ interval是一个角函数,它在控制器内使用$ this调用一个函数。如果函数调用是从摘要产生的,还是以明确的方式绑定,那么“this”只会在上下文中出现? – msg45f 2015-04-05 09:43:02

+1

@ msg45f这与角度或摘要无关。这是一个JavaScript的东西。 'this'指的是封闭范围,当你传递一个函数需要的方法时,对象的上下文将会丢失,并且你会得到一个独立的函数,其中'this'意味着不同的东西。 – Sulthan 2015-04-05 10:38:41

+0

我明白了。我的困惑之源是,在一个单独的控制器中,'ng-click'调用的方法在上下文中具有this,当它不是由'$ interval'调用的时候,我不确定出了什么问题。 – msg45f 2015-04-05 10:50:11