Angular复选框过滤数据列表

时间:2013-09-12 12:51:44

标签: angularjs filter angularjs-ng-repeat angularjs-filter

通过复选框看到了一些过滤数据的选项,但对于我希望Angular能够轻松完成的事情,这一切看起来都相当复杂。

抓住http://plnkr.co/edit/Gog4qkLKxeH7x3EnBT0i

所以这里有一些过滤器,但我感兴趣的是复选框。使用一个非常漂亮的Angular UI模块,我发现它叫做Unique,它列出了不同类型的提供者,而不是重复它们,只列出每种类型中的一种。可爱的东西。

但是我无法过滤下面的结果集。但是,如果我从生成的复选框中获取渲染的标记并将其直接放入HTML中,它就可以工作,即使它是相同的。疯狂。

我不明白过滤,所以我做错了什么?我希望将这个独特的模块用于其他几个复选框过滤器。像门号等。

2 个答案:

答案 0 :(得分:0)

这是一个解决方案;仅显示差异:

在index.html中修改相关行,如下所示:

<li data-ng-repeat="result in results | unique: 'provider.name'">
    <input type="checkbox"
        id="cb_{{ result.provider.providerId }}"
        data-ng-model="checkbox[result.provider.providerId]"
    />
    <label for="cb_{{ result.provider.providerId }}">{{ result.provider.name }}</label>
</li>
...
<li data-ng-repeat="result in ( filteredItems = (results | filter: searchByCarClass | filter: selectCarClass | filter: searchByCheckbox )) | orderBy:orderByFilter">
    ...
</li>

在script.js中添加:

$scope.checkbox = {};
var showAll = true;
$scope.searchByCheckbox = function(result) {
    return showAll || $scope.checkbox[result.provider.providerId];
};
$scope.$watch("checkbox", function(newval, oldval) {
    showAll = true;
    angular.forEach($scope.checkbox, function(val) {
        if( val === true ) showAll = false;
    });
}, true);

(编辑)将密钥更改为$scope.checkboxproviderId。过滤器启动已禁用,因此将显示所有条目。

祝你好运!

答案 1 :(得分:0)

只是为了它的乐趣,我实现了一个具有更简单的API的解决方案(在评论中希望Leads)。在这里:

cbFilter依赖项添加到控制器,删除所有与checkbox相关的代码并将其替换为如下;这是新的API(它不能变得更简单:)

app.controller('resultsData', function($scope, $http, cbFilter){
    ...
    $scope.checkbox = cbFilter($scope, "provider.providerId");
    ...
}

替换列表中的过滤器(通知searchByCheckbox替换为checkbox):

<li data-ng-repeat="result in ( filteredItems = (results | filter: searchByCarClass | filter: selectCarClass | filter: checkbox )) | orderBy:orderByFilter">

最后,添加服务:

app.factory("cbFilter", ["$parse", function($parse) {
    return function($scope, matchExpression) {
        var showAll = true,
            getter = $parse(matchExpression),
            filter = function(data) {
                if( showAll ) return true;
                return filter[getter(data)] === true;
            },
            unwatch = $scope.$watch(
                function() {
                    var x, ret = {};
                    for( x in filter ) {
                        if( !filter.hasOwnProperty(x) ) continue;
                        ret[x] = filter[x];
                    }
                    return ret;
                },
                function() {
                    showAll = true;
                    angular.forEach(filter, function(val) {
                        if( val === true ) showAll = false;
                    });
                },
                true
            );

        $scope.$on("$destroy", unwatch);

        return filter;
    };
}]);

实施比以前复杂得多,而且可能更慢。然而,API更简单(单行)。