2014-10-19 18 views
89

Tôi có đầu vào lọc danh sách ng lặp lại khi thay đổi. Lặp lại chứa rất nhiều dữ liệu và mất vài giây để lọc qua mọi thứ. Tôi muốn bị chậm trễ 0,5 giây trước khi tôi bắt đầu quá trình lọc. Cách chính xác trong góc để tạo sự chậm trễ này là gì?Độ trễ ng thay đổi góc

Input

<input ng-model="xyz" ng-change="FilterByName()" /> 

Lặp lại

<div ng-repeat"foo in bar"> 
     <p>{{foo.bar}}</p> 
</div> 

Lọc Chức năng

$scope.FilterByName = function() { 
     //Filtering Stuff Here 
}); 

Cảm ơn

+1

Chỉ cần sử dụng một '$ timeout' cho 500ms. '$ scope.FilterByName = function() {$ timeout (_filterByName, 500)' – PSL

+0

@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

+0

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

Trả lời

213

Một gularJS 1.3+

Kể từ AngularJS 1.3 bạn có thể sử dụng các tài sản debouncengModelOptions 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); 
    } 
}); 
+2

Điều này rất hữu ích. Tôi không hề biết rằng Angular có một chức năng trả lời. –

+2

Lưu ý rằng 'ng-model-options' chỉ được thêm vào trong [Angular v1.3] (https://github.com/angular/angular.js/blob/master/CHANGELOG.md#v130-beta6-expedient-caffeination -2014-04-21) (và thuộc tính debounce trong [beta.8] (https://github.com/angular/angular.js/blob/master/CHANGELOG.md#130-beta8-accidental-haiku-2014 -05-09)). Những người vẫn cần sử dụng phiên bản cũ của Angular sẽ phải sử dụng các giải pháp khác, như giải pháp từ PSL, hoặc bằng cách sử dụng mô-đun bên ngoài như [ng-debounce] (https://github.com/shahata/angular- debounce). –

+4

1860 ký tự bị xóa khỏi bộ điều khiển của tôi, cảm ơn! – paulj

17

Bạn có thể sử dụng $timeout để thêm một sự chậm trễ và có lẽ với việc sử dụng $timeout.cancel(previoustimeout) bạn có thể hủy bỏ bất kỳ thời gian chờ trước và chạy cái mới (giúp ngăn ngừa quá trình lọc được thực hiện nhiều lần consecutovely trong một khoảng thời gian)

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); 
    } 
}); 

Plnkr

+7

Đối với khách truy cập và khách truy cập trong tương lai: Câu trả lời này đã được thêm vào cho ** Angular 1.2.x ** và có thể được thêm trước khi 1.3.x được phát hành tùy chọn debounce với ng-model-options và không bao giờ có cơ hội sửa đổi câu trả lời trước khi một câu trả lời tốt hơn từ @rckd xuất hiện (khoảng 3 tháng sau lần này). – PSL

+3

Mặc dù tôi đang sử dụng js góc 1.4 Tôi vẫn tìm thấy giải pháp timeout $ hữu ích với 'ng-change' khi tôi không muốn loại bỏ mô hình. – SStanley

6

tôi biết câu hỏi là quá già. Nhưng vẫn muốn cung cấp một cách nhanh hơn để đạt được điều này bằng cách sử dụng debouncing.

Vì vậy, các mã có thể được viết như

<input ng-model="xyz" ng-change="FilterByName()" ng-model-options="{debounce: 500}"/> 

debounce sẽ mất số trong mili giây.

0

hoặc bạn có thể sử dụng chỉ thị 'typeahead-chờ-ms = "1000"' từ angular-ui

<input 
    typeahead="name for name in filterWasChanged()" 
    typeahead-wait-ms="1000" 
    type="text" placeholder="search" 
    class="form-control" style="text-align: right" 
    ng-model="templates.model.filters.name"> 
Các vấn đề liên quan