通过复选框看到了一些过滤数据的选项,但对于我希望Angular能够轻松完成的事情,这一切看起来都相当复杂。
抓住http://plnkr.co/edit/Gog4qkLKxeH7x3EnBT0i
所以这里有一些过滤器,但我感兴趣的是复选框。使用一个非常漂亮的Angular UI模块,我发现它叫做Unique,它列出了不同类型的提供者,而不是重复它们,只列出每种类型中的一种。可爱的东西。
但是我无法过滤下面的结果集。但是,如果我从生成的复选框中获取渲染的标记并将其直接放入HTML中,它就可以工作,即使它是相同的。疯狂。
我不明白过滤,所以我做错了什么?我希望将这个独特的模块用于其他几个复选框过滤器。像门号等。
答案 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.checkbox
至providerId
。过滤器启动已禁用,因此将显示所有条目。
答案 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更简单(单行)。