0

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

看看http://plnkr.co/edit/Gog4qkLKxeH7x3EnBT0i

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

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

我对过滤的了解不够,所以我做错了什么?我希望将独特的模块用于其他几个复选框过滤器。比如门牌号等等。

4

2 回答 2

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。过滤器开始禁用,因此显示所有条目。

祝你好运!

于 2013-09-12T14:36:06.710 回答
0

只是为了好玩,我实现了一个具有更简单 API 的解决方案(希望在评论中提供线索)。它是这样的:

给控制器添加cbFilter依赖,去掉所有checkbox相关代码,替换如下;这是新的 API(再简单不过了 :)

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

R替换列表中的过滤器(注意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 要简单得多(单行)。

于 2013-09-13T14:32:07.507 回答