我的 AngularJS 控制器正在调用 API 来获取成员列表。可以使用多个过滤器查询 API,例如年龄范围、姓名搜索、邮政编码等。
我想要完成的是让用户感觉搜索真的很快。因此,当用户进行过滤时,我正在关注过滤器的更改。当过滤器更改时,我会立即执行新的搜索 API 调用,而不是等待用户单击“搜索”。
其思路是,当用户完成过滤并点击“搜索”时,系统应该已经完成搜索,可以输出搜索结果。
问题:当用户单击“搜索”并publish()
调用该函数时,我必须确保当前没有 API 搜索正在进行,如果有,请等待它完成。然后我将搜索结果从隐藏发布memberslist.temp
到可见memberslist.members
。
// Current code works, except the publish function. See the TODO:
app.controller('SearchCtrl', ['$scope', 'Restangular', '$timeout', function($scope, Restangular, $timeout) {
// Pushes prefetched search results over to the visible search results
// TODO: Check if search is ongoing...
$scope.publish = function() {
$scope.memberslist.members = $scope.memberslist.temp;
};
// Watch filters for changes
var searchTimer = false;
var previousSearch = [$scope.name, $scope.minAge, $scope.maxAge];
$scope.$watch('[name, minAge, maxAge]', function(newVal, oldVal, scope){
if (searchTimer) {
$timeout.cancel(searchTimer);
}
// Do search only after the user has stopped typing for 400 ms
searchTimer = $timeout(function(){
if (!_.isEqual(newVal, previousSearch)) {
previousSearch = newVal;
scope.search();
}
}, 400);
}, true);
$scope.search = function() {
var query_params = {
name: $scope.name,
price_min: $scope.minAge,
price_max: $scope.maxAge
};
Restangular.all('members').getList(query_params)
.then(function(members){
$scope.memberslist.temp = members;
});
};
}]);
我的第一个想法是设置一个像 isSearching = true 这样的变量,然后在搜索调用返回结果后将其设置回 false。似乎无法让它工作。