範圍

2017-03-16 72 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