西维斯特的答案是你过滤事物的正常方式。您的代码看起来只想过滤到与每个输入字段匹配的对象。代码尝试查找每个属性都与searchParams对象匹配的对象。在这一点上,我看不出找到该对象有什么好处,因为用户已经再次创建了该对象!尽管如此,这里有一个正确的代码版本:
Live demo here.
<div ng-repeat="data in actualData | filter:searchData()">
$scope.searchData = function() {
return function(item) {
return Object.keys(item).every(function(key) {
// skip the $$hashKey property Angular adds to objects
if (key === '$$hashKey') { return true; }
var searchKey = key.charAt(0).toLowerCase()+key.slice(1);
return item[key].toLowerCase() === $scope.searchParams[searchKey].toLowerCase();
});
};
};
为了浏览器和服务器,您确实需要限制来自服务器的数据。实现LIMIT,OFFSET系统很容易。总的来说,您只需要能够向服务器查询特定的记录。
从您的评论来看,似乎您肯定希望Angular内置过滤器
filter:searchParams
,然后将您的
searchParams
模型以匹配您的数据。为了好玩,我将提供更多的选项来进行更精细的调整。
这个几乎模仿了
过滤器:searchParams
。您可以更改
> 1
当部分匹配开始时进行调整,或者只有当两项完全相等时才返回true
===
以禁用部分匹配。这里的不同之处在于,所有项目在匹配之前都是隐藏的,而
过滤器:searchParams
将显示所有项目,然后删除不匹配的项目。
Live demo here.
$scope.searchData = function() {
return function(item) {
return Object.keys(item).some(function(key) {
if (key === '$$hashKey') { return false; }
var searchKey = key.charAt(0).toLowerCase()+key.slice(1);
var currentVal = $scope.searchParams[searchKey].toLowerCase();
var match = item[key].toLowerCase().match(currentVal);
return currentVal.length > 1 && match;
});
};
};
最后,完美模仿
过滤器:searchParams
,您只需输入一个复选框,在有用户输入且输入足够长以开始部分匹配之前,不要过滤项目。
Live demo here.
$scope.searchData = function() {
var partialMatchLength = 2;
return function(item) {
var shouldFilter = Object.keys($scope.searchParams).some(function(key) {
return $scope.searchParams[key] && $scope.searchParams[key].length >= partialMatchLength;
});
if (!shouldFilter) { return true; }
return Object.keys(item).some(function(key) {
if (key === '$$hashKey') { return false; }
var searchKey = key.charAt(0).toLowerCase()+key.slice(1);
var currentVal = $scope.searchParams[searchKey].toLowerCase();
var match = item[key].toLowerCase().match(currentVal);
return currentVal.length >= partialMatchLength && match;
});
};
};