【问题标题】:Chaining Angular filters in controller while making them variable在控制器中链接 Angular 过滤器,同时使它们可变
【发布时间】:2013-07-21 19:30:34
【问题描述】:

假设我创建了一个 Angular 应用并编写了一些新过滤器:仅显示 odds,并且仅显示 lucky 数字。

有一个oddList 过滤器和一个luckyList 过滤器:

var app = angular.module('app', []);
app.filter('oddList', function() {
    return function(items) {
        var filtered = [];
        angular.forEach(items, function(item) {
            if (item % 2 !== 0)
                filtered.push(item);
        });
        return filtered;
    };
});
app.filter('luckyList', function() {
    return function(items) {
        var filtered = [];
        angular.forEach(items, function(item) {
            if (item === 2 || item === 7 || item === 11)
                filtered.push(item);
        });
        return filtered;
    };
});

在视图部分,我可以链接这些过滤器:

<ul><li ng-repeat="number in numbers | oddList | luckyList">{$number}</li></ul>

当这个工作正常时,我应该会看到 711 剩余。

我想为这个ng-repeat 设置我的过滤器可变我可以做一些类似于这个过程的事情吗?

假设我将变量过滤器命名为filter:listFilter,以便在我们的控制器中,我们可以动态更新$scope.listFilter

<ul><li ng-repeat="number in numbers | filter:listFilter">{$number}</li></ul>

以及带有伪代码的控制器:

app.controller('main', function($scope, $filter) {
    $scope.numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
    $scope.listFilter = $filter('oddList | luckyList');
});

知道如何在控制器中链接(可变)过滤器吗?希望能够在奇数、幸运和/或两者之间切换。

【问题讨论】:

标签: angularjs filter


【解决方案1】:

一种方法是使用函数返回过滤后的数据:

function MainCtrl($scope, $filter) {
    $scope.numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

    $scope.filteredNumbers = function() {
        var result = $scope.numbers;

        if ($scope.oddListEnabled) {
            result = $filter('oddList')(result);  
        }        
        if ($scope.luckyListEnabled) {    
            result = $filter('luckyList')(result);
        }

        return result;
    };
}

还有模板:

<ul>
  <li ng-repeat="number in filteredNumbers()">
    {{number}}
  </li>
</ul>

这是一个小插曲:http://plnkr.co/edit/4ectDA?p=preview

【讨论】:

  • 华丽!甚至没有考虑使用函数作为 ng-repeat 数据提供者。谢谢
  • 但是是否可以执行&lt;li ng-repeat="product in products | filter:{{selectedFilter}}"&gt;&lt;select ng-model="selectedFilter"&gt; 之类的操作,以便过滤器自动更改?
  • 是的,@ViniciusPires 您还可以定义自定义过滤器:'
  • ' 通过使用“:”,您可以将新参数传递到函数:'filter('filteredNumbers',function(){返回函数filteredNumbers(数字,启用列表){};}); '
  • 对不起,我觉得我说得不够清楚...我在问是否可以在运行时更改过滤器,从控制器或直接为过滤器设置新值数据绑定...此时我发现只需稍作改动就可以实现我所说的:&lt;li ng-repeat="product in products | filter:selectedFilter"&gt;...所以可以将$scope.selectedFilter的值设置为{ name: 'Coke' }或@ 987654329@,取决于用户在组合&lt;select ng-model="selectedFilter"&gt;中选择的内容...只是分享:)
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签