当AngularJS中文本框发生变化时,调用带有延迟的函数
Call Function with Delay When Textbox Changes in AngularJS
似乎找不到这样做的例子。
我已经成功地创建了一个文本框,每次它改变时调用一个函数。我想做的是只在用户停止输入x毫秒时调用该函数。
我知道如何在JQuery中使用keyup事件来实现它,并且可能会让它以这种方式工作,但我想用"Angular的方式"来实现它。
编辑
也许从标签或文本中看不清楚,但我正在使用AngularJS,并希望使用正确的方法为该框架创建此延迟功能。
有这种方式的ng-model-options
<input id="delayedModel" ng-model="delayedModel" ng-change="callDelayed()" ng-model-options="{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }" />
callDelayed
方法只在键入最后一个字符或blur
这里是文档https://docs.angularjs.org/api/ng/directive/ngModelOptions
对于角化方法,可以在控制器中注入$timeout
作为依赖项,并在ng-model
中指定的范围变量上使用$watch
。
var timer=false;
$scope.ModelName='foo';
$scope.$watch('ModelName', function(){
if(timer){
$timeout.cancel(timer)
}
timer= $timeout(function(){
/* run code*/
},delay)
});
虽然@charlietfl提供了完全可以接受的答案,但我想与您分享另一种不使用$watch
方法的方法:
模板:
<input id="delayedModel" ng-model="delayedModel" ng-change="callDelayed()"/>
控制器:
(function (timer, delay) {
$scope.callDelayed= function () {
if(timer){
$timeout.cancel(timer)
}
timer = $timeout(function(){
/* run code*/
}, delay)
};
})(false, 500);
也许有必要指出为什么使用自执行匿名函数。主要原因是不让time
和delay
变量污染控制器范围。在这种情况下,它们是在局部函数作用域中定义的。
我还发现了一个有趣的AngularJS项目angular-debounce,它可以很容易地实现同样的效果。使用
debounce
指令可以像这样处理模型更新:
<input type="text" ng-model="delayedModel" debounce="500"></input>
相关文章:
- jQuery延迟了ajax调用的循环
- 使用jquery延迟对象链接多个ajax调用
- jQuery通过嵌套的ajax调用延迟对象
- jQuery 延迟的 AJAX 调用返回值
- 如何在 JS 中调用 2 次或更多次时延迟函数执行
- AJAX 调用和表单提交之间的延迟
- 如何按顺序调用延迟函数
- 使用promise或setTimeout确定延迟函数的调用顺序
- 如何调用具有延迟的函数
- 将for循环从完成延迟到返回API调用
- 在JS文件中设置延迟以调用JS文件
- jQuery deferred:用于延迟函数的返回,直到函数内的异步调用完成+获取返回值
- 防止 JavaScript 调用延迟出现
- Javascript AJAX函数调用延迟
- 将第一个函数调用延迟n秒
- jsTree v.3使用ajax调用延迟加载
- 导致ajax调用延迟的原因是什么?
- 函数调用延迟
- 如果在此期间发生其他事件,如何停止调用延迟函数
- Internet Explorer启动AJAX调用延迟