据我所知,对于Angular而言,解决此问题有两种主要方式:
- 定义自定义过滤器
- 定义一个函数以过滤您的数据,并使用ng-show或ng-hide调用它
我有一个大型数据表
如果我理解正确,你之所以特别提到这一点是因为性能是一个重要问题。
有一篇很好的文章介绍了这两种解决方案之间的区别:http://www.bennadel.com/blog/2487-filter-vs-nghide-with-ngrepeat-in-angularjs.htm
由于性能可能对您非常重要,我建议您选择第二种方法。
在您的视图中:
<tbody ng-repeat="url in urls" ng-show="filterUrl(url)">
在你的控制器中:
$scope.searchFilter = "";
$scope.columnFilter = $scope.headings[5];
$scope.filterUrl = function(url){
if(!$scope.searchFilter || $scope.searchFilter == "")
return url;
var searchFilter= $scope.searchFilter.toLowerCase();
var trafficString = url.traffic.toString();
var idString = url.traffic.toString();
switch($scope.columnFilter){
case $scope.headings[0]:
return url.title.toLowerCase().indexOf(searchFilter) != -1;
case $scope.headings[1]:
return url.url.toLowerCase().indexOf(searchFilter) != -1;
case $scope.headings[2]:
return trafficString.indexOf(searchFilter) != -1;
case $scope.headings[3]:
return url.descr.toLowerCase().indexOf(searchFilter) != -1;
case $scope.headings[4]:
return idString.indexOf(searchFilter) != -1;
case $scope.headings[5]:
return url.title.toLowerCase().indexOf(searchFilter) != -1 ||
url.url.toLowerCase().indexOf(searchFilter) != -1 ||
trafficString.indexOf(searchFilter) != -1 ||
url.descr.toLowerCase().indexOf(searchFilter) != -1 ||
idString.indexOf(searchFilter) != -1;
}
};
更新:
如果你选择第一种方法:
在你的视图中:
<tbody ng-repeat="url in urls | filterByColumn: searchFilter :columnFilter">
过滤器:
app.filter('filterByColumn', function(){
return function(urls, text, columnFilter){
var processed = [];
if(!text || text == "")
return urls;
urls.forEach(function(url){
var searchFilter= text.toLowerCase();
var trafficString = url.traffic.toString();
var idString = url.traffic.toString();
switch(columnFilter){
case "Title":
if( url.title.toLowerCase().indexOf(searchFilter) != -1)
processed.push(url);
break;
case "Url":
if(url.url.toLowerCase().indexOf(searchFilter) != -1)
processed.push(url);
break;
case "Traffic":
if(trafficString.indexOf(searchFilter) != -1)
processed.push(url);
break;
case "Description":
if(url.descr.toLowerCase().indexOf(searchFilter) != -1)
processed.push(url);
break;
case "Id":
if( idString.indexOf(searchFilter) != -1)
processed.push(url);
break;
case "All":
if( url.title.toLowerCase().indexOf(searchFilter) != -1 ||
url.url.toLowerCase().indexOf(searchFilter) != -1 ||
trafficString.indexOf(searchFilter) != -1 ||
url.descr.toLowerCase().indexOf(searchFilter) != -1 ||
idString.indexOf(searchFilter) != -1)
processed.push(url);
break;
}
});
return processed;
};
});
这里有一个 Plunkr:http://plnkr.co/edit/xCwI2AURFpvb6xHgYHxS?p=preview