我是一名AngularJS新手,我正在构建一个小型概念验证汽车租赁列表应用程序,它可以提取一些JSON并通过ng-repeat显示各种数据,并带有几个过滤器:
<article data-ng-repeat="result in results | filter:search" class="result">
<header><h3>{{result.carType.name}}, {{result.carDetails.doors}} door, £{{result.price.value}} - {{ result.company.name }}</h3></header>
<ul class="result-features">
<li>{{result.carDetails.hireDuration}} day hire</li>
<li data-ng-show="result.carDetails.airCon">Air conditioning</li>
<li data-ng-show="result.carDetails.unlimitedMileage">Unlimited Mileage</li>
<li data-ng-show="result.carDetails.theftProtection">Theft Protection</li>
</ul>
</article>
<h2>Filters</h2>
<h4>Doors:</h4>
<select data-ng-model="search.carDetails">
<option value="">All</option>
<option value="2">2</option>
<option value="4">4</option>
<option value="9">9</option>
</select>
<h4>Provider:</h4>
Atlas Choice <input type="checkbox" data-ng-model="search.company" ng-true-value="Atlas Choice" ng-false-value="" value="Atlas Choice" /><br>
Holiday Autos <input type="checkbox" data-ng-model="search.company" ng-true-value="Holiday Autos" ng-false-value="" value="Holiday Autos" /><br>
Avis <input type="checkbox" data-ng-model="search.company" ng-true-value="Avis" ng-false-value="" value="Avis" /><br>
现在我想在我的控制器中创建一个自定义过滤器,它可以遍历ng-repeat中的项目,只返回符合特定条件的项目 - 例如,我可能会创建一个基于哪个值的数组'检查提供者的复选框,然后根据该复选框评估每个ng-repeat项目。我只是无法弄清楚我是怎么做的,但就语法而言 - 任何人都可以帮忙吗?
这是我的Plunker: http://plnkr.co/edit/lNJNYagMC2rszbSOF95k?p=preview
答案 0 :(得分:153)
如果要运行一些自定义过滤器逻辑,可以创建一个函数,该函数将数组元素作为参数,并根据它是否应该在搜索结果中返回true
或false
。然后将其传递给filter
指令,就像使用search
对象一样,例如:
<强> JS:强>
$scope.filterFn = function(car)
{
// Do some tests
if(car.carDetails.doors > 2)
{
return true; // this will be listed in the results
}
return false; // otherwise it won't be within the results
};
<强> HTML:强>
...
<article data-ng-repeat="result in results | filter:search | filter:filterFn" class="result">
...
如您所见,您可以将多个过滤器链接在一起,因此添加自定义过滤器功能不会强制您使用search
对象删除以前的过滤器(它们将无缝地协同工作)。
答案 1 :(得分:33)
如果您仍想要自定义过滤器,则可以将搜索模型传递给过滤器:
<article data-ng-repeat="result in results | cartypefilter:search" class="result">
cartypefilter的定义如下所示:
app.filter('cartypefilter', function() {
return function(items, search) {
if (!search) {
return items;
}
var carType = search.carType;
if (!carType || '' === carType) {
return items;
}
return items.filter(function(element, index, array) {
return element.carType.name === search.carType;
});
};
});
答案 2 :(得分:5)
您可以在同一ng-repeat过滤器中调用更多1个功能过滤器
<article data-ng-repeat="result in results | filter:search() | filter:filterFn()" class="result">
答案 3 :(得分:1)
解决此问题的最简单方法之一是使用全部搜索的$
。
这是一个显示它工作的plunker。我已将复选框更改为收音机(因为我认为它们应该是互补的)..
http://plnkr.co/edit/dHzvm6hR5P8G4wPuTxoi?p=preview
如果您想要一种非常具体的方法(而不是进行通用搜索),您需要在搜索中使用函数。
文档在这里