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

... 당신은 간격을 설정하고 그것을 확인 후 바로 당신이 변수가 "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를 사용해야합니다. 범위에 대한

그리고하지 ... T1 한 번 검사 만하기 때문에

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