我的控制器中有这个函数,它会触发控制器中的搜索函数来进行搜索。
$scope.fetchScannedData = function () {
$timeout.cancel(fetchScannedDataTimer);
fetchScannedDataTimer = $timeout(function () {
$scope.search(); // do search with 5 second delay
}, fetchScannedDataDelay);
};
这是我的输入字段:
<input type="text" class="form-control" ng-enter="search()" placeholder="Enter Search ID" ng-change="fetchScannedData()" ng-model="id">
(注意我的表单字段上的ng更改指令触发了5秒的延迟)
我的问题是,我如何编辑这个delayScannedData函数,以便只有当输入的文本由非人类(条形码扫描)快速输入时才触发延迟,但当输入的文字由人类输入时没有延迟?
我建议用debounce包装您的通话:
https://lodash.com/docs#debounce
或者更简单的是,如果你改变你的代码结构,你可以使用Angular 1.3 ngModelOptions:
https://docs.angularjs.org/api/ng/directive/ngModelOptions
我所说的改变结构的意思是,与你所拥有的不同:
$scope.searchParams = {};
$scope.$watch('searchParams.query', function(newVal, oldVal){
if(newVal !== oldVal){
$scope.fetchScannedData();
}
});
$scope.fetchScannedData = function () {
$timeout.cancel(fetchScannedDataTimer);
fetchScannedDataTimer = $timeout(function () {
$scope.search(); // do search with 5 second delay
}, fetchScannedDataDelay);
};
<input type="text" class="form-control" ng-enter="search()" placeholder="Enter Search ID" ng-model="searchParams.query" ng-model-options="{ debounce: 1000 }">
不确定您的search()方法是什么样子的,但您需要确保将其更改为指向searchParams.query字符串。
我认为这种方法会比你目前采用的方法更"角度"。