Một gularJS 1.3+
Kể từ AngularJS 1.3 bạn có thể sử dụng các tài sản debounce
ngModelOptions
cung cấp để đạt được điều đó rất dễ dàng mà không cần sử dụng $timeout
ở tất cả. Dưới đây là một ví dụ:
HTML:
<div ng-app='app' ng-controller='Ctrl'>
<input type='text' placeholder='Type a name..'
ng-model='vm.name'
ng-model-options='{ debounce: 1000 }'
ng-change='vm.greet()'
/>
<p ng-bind='vm.greeting'></p>
</div>
JS:
angular.module('app', [])
.controller('Ctrl', [
'$scope',
'$log',
function($scope, $log){
var vm = $scope.vm = {};
vm.name = '';
vm.greeting = '';
vm.greet = function greet(){
vm.greeting = vm.name ? 'Hey, ' + vm.name + '!' : '';
$log.info(vm.greeting);
};
}
]);
- HOẶC -
Check the Fiddle
Trước AngularJS 1.3
Bạn sẽ phải sử dụng $ timeout để thêm thời gian chờ và có thể với việc sử dụng $ timeout.cancel (previoustimeout), bạn có thể hủy bất kỳ thời gian chờ trước nào và chạy chương trình mới (giúp ngăn việc lọc được thực hiện nhiều lần consecutovely trong một khoảng thời gian)
Dưới đây là một ví dụ:
app.controller('MainCtrl', function($scope, $timeout) {
var _timeout;
//...
//...
$scope.FilterByName = function() {
if(_timeout) { // if there is already a timeout in process cancel it
$timeout.cancel(_timeout);
}
_timeout = $timeout(function() {
console.log('filtering');
_timeout = null;
}, 500);
}
});
Chỉ cần sử dụng một '$ timeout' cho 500ms. '$ scope.FilterByName = function() {$ timeout (_filterByName, 500)' – PSL
@PSL ở đâu trong hàm? Tôi chỉ muốn tìm kiếm để thực hiện một lần. Nếu tôi chỉ bù đắp nó, nó sẽ chỉ tạo ra một sự chậm trễ lớn hơn và làm nhiều tìm kiếm. – MGot90
Vâng, trong chức năng của bạn. bình luận trước có một đoạn trích. Bạn có thể sử dụng '$ timeout.cancel (timeoutpromise)' nếu một thời gian chờ đang diễn ra và một thay đổi khác được kích hoạt. – PSL