如何在Angular js中基于两个自定义过滤器过滤数据
How to filter data based on two custom filters in Angular js
我有两个自定义筛选器,我想用这两个自定义过滤器过滤我的数据。但我面临的问题是,如果我一个接一个地使用,那么它们效果很好,但当我试图同时使用两个过滤器时,就没有输出了。我的代码如下:
<script>
var myApp = angular.module('myApp', []);
myApp
.filter('selectedTags', function() {
return function(postdata, tags) {
return postdata.filter(function(task) {
for (var i in task.tarn_list) {
if (tags.indexOf(task.tarn_list[i]) != -1) {
return true;
}
}
return false;
});
};
})
.filter('selectedDep', function() {
return function(postdata, tags) {
return postdata.filter(function(task) {
for (var i in task.deployment) {
if (tags.indexOf(task.deployment[i]) != -1) {
return true;
}
}
return false;
});
};
})
.controller('PostList', ['$scope', '$http', function($scope, $http) {
var jsonFile='../../json.php';
$http.get(jsonFile).success(function(data) {
$scope.postdata = data;
});
$scope.useMakes=[]
$scope.checkBoxModel={
search:[],
ddsearch:[]
};
$scope.totalFeatures=features;
$scope.deployment=all_deployment;
}]);
</script>
我的div如下所示,我想对其应用过滤器:
<div ng-repeat="record in postdata | selectedDep:checkBoxModel.ddsearch | selectedTags:checkBoxModel.search" >
在没有看到实际数据集的情况下,考虑到你在问题中暴露的属性和循环的性质,这里的应该让船漂浮起来;
https://jsfiddle.net/op7m14m1/1/
我选择了嵌套过滤器,而不是for in
循环(本质上就是您正在做的)。
var predicate = [];
dataset.filter(function (a) {
var inner = a.inner.filter(function (b) {
return predicate.indexOf(b) > -1;
});
return inner.length > 0;
});
查看您拥有的两个过滤器,您可以将其分解为一个函数,该函数带有一个绑定(或传入)参数,该参数规定了使用哪个属性作为过滤器的匹配器。
像这样的东西;
function generic () {
return function (prop, dataset, predicate) {
return dataset.filter(function (element) {
var innards = element[prop].filter(function (iEl) {
return predicate.indexOf(iEl) > -1;
});
return innards.length > 0;
});
}
}
然后要使用它,您可以执行以下操作;
module.filter('genericFilter', generic);
module.filter('selectedDep', generic.bind(null, 'deployment');
module.filter('selectedTags', generic.bind(null, 'tarn_list');
// $filter('genericFilter')('deployment', [], ['a']);
// $filter('selectedDep')([], ['b']);
// $filter('selectedTags')([], ['c']);
此设置允许使用一个函数,您可以随心所欲地重复使用该函数-只需传入要对其进行深度筛选的属性,或抢先绑定它。
相关文章:
- jQuery验证插件-比较两个选择下拉列表的自定义方法
- 将单个服务逻辑应用于两个类似的按钮
- 如何将相同的功能应用于两个按钮
- 两个日期之间的自定义过滤器 AngularJS
- 添加混合 javascript 函数,使内容淡入列内的另一个内容/使其适用于两个单独的列
- 使用自定义规则计算两个日期之间的天数
- 将 jQuery 事件应用于两个 DOM ID 的选择器
- 如何比较两个函数中定义的两个 JavaScript 变量值
- 仅将画布复合应用于两个操作
- 挖空.js两个输入字段的逻辑 OR 的自定义验证规则
- 如何检查属性的null和未定义的两个值
- target_blank适用于两个javascript函数,即使它适用于一个javascript函数
- 将相同的随机化数组索引值应用于两个不同的变量
- jQuery UI相对于两个元素的位置
- Moment.js用星期和工作日定义的两个时刻的差值会得到错误的结果
- 使用一个javascript自定义滚动三个列表
- 猫鼬自定义验证几个字段在更新
- 选择窗体中作用于两个不同下拉框的所有复选框
- 基础Javascript -应用于两个类的样式
- 如何将函数应用于两个元素