AngularJS:自定义过滤器和ng-repeat

Par*_*tal 68 angularjs ng-repeat angular-filters

我是AngularJS的新手,我正在构建一个小概念概念车租用列表应用程序,它可以提取一些JSON并通过ng-repeat显示各种数据,并带有几个过滤器:

   <article data-ng-repeat="result in results | filter:search" class="result">
        <header><h3>{{result.carType.name}}, {{result.carDetails.doors}} door, &pound;{{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>      
Run Code Online (Sandbox Code Playgroud)

现在我想在我的控制器中创建一个自定义过滤器,它可以遍历ng-repeat中的项目,只返回符合特定条件的项目 - 例如,我可能会根据哪个'provider'复选框创建一个值数组检查,然后评估每个ng-repeat项目.我只是无法弄清楚我是怎么做的,但就语法而言 - 任何人都可以帮忙吗?

这是我的Plunker:http://plnkr.co/edit/lNJNYagMC2rszbSOF95k?p = preview

mir*_*rmx 159

如果要运行某些自定义过滤器逻辑,可以创建一个函数,该函数将数组元素作为参数并返回truefalse基于它是否应该在搜索结果中.然后将其传递给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
};
Run Code Online (Sandbox Code Playgroud)

HTML:

...
<article data-ng-repeat="result in results | filter:search | filter:filterFn" class="result">
...
Run Code Online (Sandbox Code Playgroud)

如您所见,您可以将多个过滤器链接在一起,因此添加自定义过滤器功能不会强制您使用该search对象删除以前的过滤器(它们将无缝地协同工作).

  • 很有意思!过滤器可以简化为`return car.carDetails.doors> 2;`. (15认同)
  • 当然可以.然而,我已经决定使用更详细的版本,以使其更清晰,作为一个学习的例子. (14认同)
  • 如果您需要更复杂的过滤器,您也可以[通过过滤器多个参数](http://stackoverflow.com/questions/16227325/how-do-i-call-an-angular-js-filter-with -multiple论点). (2认同)
  • 我喜欢`return(car.carDetails.doors> 2);` (2认同)

orj*_*jan 34

如果您仍想要自定义过滤器,则可以将搜索模型传递给过滤器:

<article data-ng-repeat="result in results | cartypefilter:search" class="result">
Run Code Online (Sandbox Code Playgroud)

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;
    });

  };
});
Run Code Online (Sandbox Code Playgroud)

http://plnkr.co/edit/kBcUIayO8tQsTTjTA2vO?p=preview

  • 你能为自定义过滤器提供多个参数吗? (4认同)

小智 6

您可以在同一个ng-repeat过滤器中调用更多的1个函数过滤器

<article data-ng-repeat="result in results | filter:search() | filter:filterFn()" class="result">
Run Code Online (Sandbox Code Playgroud)