4

我试图在用户停止输入后的短暂延迟后调用某个函数,但clearTimeout()似乎没有按照我的想法进行操作。以下是Angular JS控制器内部。Javascript:无法清除超时

$scope.typing = false; 
$scope.delay = undefined; 

//Triggered by ng-keydown... 
$scope.startTyping = function() { 
    $scope.typing = true; 
      console.log('start1', $scope.delay); //6 
    clearTimeout($scope.delay); 
      console.log('start2', $scope.delay); //6... NOT getting cleared! 
} 

//Triggered by ng-keyup... 
$scope.stopTyping = function() { 
    $scope.typing = false; 
    $scope.delay = setTimeout($scope.lookup, 1000); 
} 

$scope.lookup = function() { 

    if ($scope.typing === true){ 
     return false; 
    } 
    console.log('lookup'); //This fires after every key! 

我看到在日志中lookup每一个关键,而不是每延迟之后。为什么是这样?

更新

记录的delay值之后显然clearTimeout()没有正在重置计时器,并代替,多个定时器越来越集和每一个被触发的查找功能。

仅供参考...

对于别人的故障排除clearTimeout(),这里是可以解决你的问题(但并没有解决我的)一些类似的问题:

clearTimeout not working

clearTimeout() not working

clearTimeout is not working

clearTimeout not working

+0

它是 “lookupJobs” 或只是 “查找”? – Pointy

+0

你能告诉我们如何定义'$ scope.lookupJobs'吗?此外,这行看起来很奇怪:'$ scope.delay;'。这不是一个有效的命令,要么删除它,要么像'$ scope.delay = undefined;' –

+0

''keydown'事件发生在'keyup'事件之后。而你想'cleatTimeout'是一个未定义的变量。 – Praveen

回答

3

http://jsfiddle.net/coma/y52Q2/1/

控制器

app.controller('Main', function ($scope) { 

    var delay; 

    var lookup = function() { 

     console.log($scope.input); 
    }; 

    $scope.lookup = function() { 

     clearTimeout(delay); 
     delay = setTimeout(lookup, 1000); 
    }; 
}); 

查看

<div ng-controller="Main"> 
    <input ng-model="input" ng-change="lookup()"/> 
</div> 

与向上/向下学尝试的问题是,stopTyping被称为更多的时间比startTyping

http://jsfiddle.net/coma/5hFjY/1/

+0

是否有理由将其重构为用户'ng-change()'?我在这里发布的代码有点简化,所以这需要我做一些工作。我可以做到这一点,但它有助于理解这个问题正在解决什么问题。 – emersonthis

+0

我重构了它以使用'ng-change()',它现在可以工作。但我仍然喜欢理解为什么我的原始版本不起作用。 – emersonthis

+0

现在就来看看吧! – coma

1

我会做这样的:http://jsfiddle.net/TN6zA/2/

$scope = {}; 

    //on keydown... 
    document.getElementById("foo").onkeydown = function() {  
     clearTimeout($scope.delay); 
     $scope.delay = setTimeout($scope.lookup, 1000); 
     document.getElementById("myDiv").innerHTML = "Someone is typing"; 
    } 

    $scope.lookup = function() { 
     document.getElementById("myDiv").innerHTML = "Nobody is typing"; 
    } 

    $scope.lookup(); 
+0

hummm ... @SDP正在使用AngularJS ... – coma