范围

2017-03-16 71 views
0

价值变动删除计时器我有下面的代码在我的角度控制范围

scope.$watch(function(){ return scope.state; }, function() { 
    var t1 = scope.state; 
     var Interval = setInterval(function(){ Timer() }, 2500); 
     if(t1 != "b"){ 
      clearInterval(Interval); 
     } 

     function Timer() { 
      console.log(t1); 
     } 
}); 

我的期望是,一旦T1变为“B”,定时器应停止印刷。无法理解t1保持打印的原因,就好像清除间隔从未发生过一样。如果这是错误的,那么正确的做法是什么。

+0

因为T1只检查一次......你设置的时间间隔,你让后马上看到如果变量是“B”,比它是。如果该变量在该瞬间不是“b”,它将永远不会被清除。 – epascarello

+0

但我有我的功能在看,我在想t1! =“b”将在scope.state的$ watch变成“b”时被验证。 – user2934433

+1

阅读下面的答案,我添加了更多关于发生的事情的细节。 – epascarello

回答

1

这是因为t1只检查一次。你设置了间隔,并在你看到变量是“b”而不是它之后。如果该变量在该瞬间不是“b”,它将永远不会被清除。

当再次调用观察器时,将创建一个新的时间间隔并重新运行该检查。如果现在变量“b”,它将杀死该时间间隔,它不会对上次调用时创建的时间间隔做任何事情。

你可能想要这样的东西,你只能在第一次创建时创建间隔。

scope.$watch(function() { return scope.state; }, function() { 
    var t1 = scope.state; 
    if (!scope.myInterval) { //if there is no interval create it 
    function timer() { 
     console.log(t1); 
    } 
    scope.myInterval = setInterval(timer, 2500); 
    } 
    if (t1 != "b") { 
    clearInterval(scope.myInterval); 
    //delete scope.myInterval; 
    } 

}); 

而且,由于您使用的角度,你应该使用他们的$ interval

,而不是在范围......

var myInterval; 
scope.$watch(function() { return scope.state; }, function() { 
    var t1 = scope.state; 
    if (!myInterval) { //if there is no interval create it 
    function timer() { 
     console.log(t1); 
    } 
    myInterval= setInterval(timer, 2500); 
    } 
    if (t1 != "b") { 
    clearInterval(myInterval); 
    myInterval = null; 
    } 

}); 
+0

我试图在范围上设置标志并克服了这个问题,但在范围上定义函数的方式是clearInterval需要使用相同的方法,而不是该实例。即使我有一个想法,因为它是新的时间间隔无法克服它。宣称范围是诀窍。谢谢 – user2934433

+1

那么它可以是外部定义的局部变量,不需要成为范围的一部分。 – epascarello