52 javascript angularjs lodash
我有以下内容监视<input>绑定到$ scope.id 的字段.每次输入字段值改变时,执行watch函数:
$scope.$watch("id", function (id) {
// code that does something based on $scope.id
});
Run Code Online (Sandbox Code Playgroud)
有没有办法可以对此进行超时或者使用_lodash进行去抖动,这样在用户更改值时代码不会在每个按键上执行.
我想要的是延迟一秒钟,以便在用户停止输入一秒后,手表内的代码块运行.请注意,输入值可能随时发生变化.例如,如果值为"1"或"10"或"1000",我需要调用该函数.这与带有建议的搜索框在Google中的工作方式类似.如果用户键入999,那么我需要调用该函数.如果他删除了9,那么它就是99,那么我需要调用该函数.
我确实有_lodash可用,因此使用它的解决方案可能最适合我的需求.
Ahm*_*yad 80
您可以在Angular 1.3.0中使用ngModelOptions
HTML:
<div ng-controller="Ctrl">
<form name="userForm">
Name:
<input type="text" name="userName"
ng-model="user.name"
ng-model-options="{ debounce: 1000 }" />
<button ng-click="userForm.userName.$rollbackViewValue(); user.name=''">Clear</button><br />
</form>
<pre>user.name = <span ng-bind="user.name"></span></pre>
</div>
Run Code Online (Sandbox Code Playgroud)
更多信息:https://docs.angularjs.org/api/ng/directive/ngModelOptions
Ale*_*yda 66
那你在找什么?
$scope.$watch("id", _.debounce(function (id) {
// Code that does something based on $scope.id
// This code will be invoked after 1 second from the last time 'id' has changed.
}, 1000));
Run Code Online (Sandbox Code Playgroud)
但是请注意,如果你想在该函数中更改$ scope,你应该将其包装$scope.$apply(...)为除非_.debounce函数在$timeout内部使用(据我所知,它不会这样做)Angular不会意识到你在该函数上所做的更改$scope.
UPDATE
至于更新的问题 - 是的,你需要包装整个回调函数体
$scope.$apply():
$scope.$watch("id", _.debounce(function (id) {
// This code will be invoked after 1 second from the last time 'id' has changed.
$scope.$apply(function(){
// Code that does something based on $scope.id
})
}, 1000));
Run Code Online (Sandbox Code Playgroud)
jda*_*era 33
我知道这个问题需要一个lodash解决方案.无论如何这里只是一个角度解决方案:
app.factory('debounce', function($timeout) {
return function(callback, interval) {
var timeout = null;
return function() {
$timeout.cancel(timeout);
var args = arguments;
timeout = $timeout(function () {
callback.apply(this, args);
}, interval);
};
};
});
Run Code Online (Sandbox Code Playgroud)
在控制器中:
app.controller('BlaCtrl', function(debounce) {
$scope.$watch("id", debounce(function (id) {
....
}, 1000));
});
Run Code Online (Sandbox Code Playgroud)
您可以将其封装在指令中.资料来源:https://gist.github.com/tommaitland/7579618
<input type="text" ng-model="id" ng-debounce="1000">
Run Code Online (Sandbox Code Playgroud)
使用Javascript
app.directive('ngDebounce', function ($timeout) {
return {
restrict: 'A',
require: 'ngModel',
priority: 99,
link: function (scope, elm, attr, ngModelCtrl) {
if (attr.type === 'radio' || attr.type === 'checkbox') {
return;
}
var delay = parseInt(attr.ngDebounce, 10);
if (isNaN(delay)) {
delay = 1000;
}
elm.unbind('input');
var debounce;
elm.bind('input', function () {
$timeout.cancel(debounce);
debounce = $timeout(function () {
scope.$apply(function () {
ngModelCtrl.$setViewValue(elm.val());
});
}, delay);
});
elm.bind('blur', function () {
scope.$apply(function () {
ngModelCtrl.$setViewValue(elm.val());
});
});
}
};
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30012 次 |
| 最近记录: |