如何在angularjs中做最简单的一组过滤条件?
how to do easiest group of filtering conditions in angularjs?
我有四个筛选条件,例如 JobType、Experience、DateAdded 和 Salary 我想对个人和团体进行筛选。为此,我在我的控制器中将过滤器定义为 filterType 并添加到模板中,如下所示。
在我的控制器中
.filter('filterType', function($filter) {
// Create the return function
// set the required parameter name to **params**
return function(jobs,workType,experience,dateAdded,salary) {
var filtered =[];
var wT = angular.isUndefined(workType);
var exp = angular.isUndefined(experience);
var dA = angular.isUndefined(dateAdded);
var sal = angular.isUndefined(salary);
if(wT && exp && dA && sal)
return jobs;
angular.forEach(jobs,function(job){
if(exp && dA && sal){
if(job.type == workType)
filtered.push(job)
}
else if(dA && sal && wT){
var exp_val = $filter('split')(experience,',',0);
if(job.experience == exp_val)
filtered.push(job)
}
else if(sal && wT && exp){
var date_field = $filter('pastDay')(job.created_at);
console.log(job.created_at);
console.log(date_field);
if(dateAdded == date_field){
filtered.push(job);
}
}
else if(wT && exp && dA){
var exp_val = $filter('split')(experience,',',0);
if(job.created_at == exp_val)
filtered.push(job)
}
});
return filtered;
}
})
在我的模板中
<div flex="20" flex-sm="100" ng-repeat="job in jobs | filterType: workType:experience:dateAdded:salary">
过滤工作如我所料,问题是假设如果我想使用过滤集进行过滤,我是否需要为其编写 if/else 语句集。好像是个很长的作品..
谁能建议最好的解决方法???????
你可以这样做:
.filter('filterType', function($filter) {
return function(jobs,workType,experience,dateAdded,salary) {
var filtered = Array.prototype.slice.apply(jobs); // make a copy of the array
if(!workType && !experience && !dateAdded && !salary){
return filtered;
}
if(workType){
filtered = $filter('filter')(filtered, {type: workType});
}
if(experience){
//filter by experience, like workType
}
if(dateAdded){
// filter by date, like workType
}
// ... other filters
return filtered;
}
})
.filter('filterType', function($filter) {
// Create the return function
// set the required parameter name to **params**
return function(jobs,wT,exp,dA,sal) {
var filtered =[];
var multiple = false;
if(!wT && !exp && !dA && !sal)
return jobs;
if(wT){
var val = multiple ? filtered : jobs;
var filtered_wT = [];
angular.forEach(val,function(job){
if(job.type == wT)
filtered_wT.push(job);
});
filtered = filtered_wT;
multiple = true;
}
if(exp){
var exp_val = $filter('split')(exp,',',0);
var filtered_exp = [];
var val = multiple ? filtered : jobs;
angular.forEach(val,function(job){
if(job.experience == exp_val)
filtered_exp.push(job);
});
filtered = filtered_exp;
multiple = true;
}
if(dA){
var val = multiple ? filtered : jobs;
var filtered_dA = [];
angular.forEach(val,function(job){
var date_field = $filter('pastDay')(job.created_at);
if(dA == date_field)
filtered_dA.push(job);
});
filtered = filtered_dA;
multiple = true;
}
if(sal){
var filtered_sal = [];
angular.forEach(jobs,function(job){
var min_sal = $filter('split')(sal,'-',0);
var max_sal = $filter('split')(sal,'-',1);
if(min_sal >= job.minsalary && max_sal <= job.maxsalary)
filtered_sal.push(job);
});
filtered = filtered_sal;
multiple = true;
}
return filtered;
}
})
我有四个筛选条件,例如 JobType、Experience、DateAdded 和 Salary 我想对个人和团体进行筛选。为此,我在我的控制器中将过滤器定义为 filterType 并添加到模板中,如下所示。
在我的控制器中
.filter('filterType', function($filter) {
// Create the return function
// set the required parameter name to **params**
return function(jobs,workType,experience,dateAdded,salary) {
var filtered =[];
var wT = angular.isUndefined(workType);
var exp = angular.isUndefined(experience);
var dA = angular.isUndefined(dateAdded);
var sal = angular.isUndefined(salary);
if(wT && exp && dA && sal)
return jobs;
angular.forEach(jobs,function(job){
if(exp && dA && sal){
if(job.type == workType)
filtered.push(job)
}
else if(dA && sal && wT){
var exp_val = $filter('split')(experience,',',0);
if(job.experience == exp_val)
filtered.push(job)
}
else if(sal && wT && exp){
var date_field = $filter('pastDay')(job.created_at);
console.log(job.created_at);
console.log(date_field);
if(dateAdded == date_field){
filtered.push(job);
}
}
else if(wT && exp && dA){
var exp_val = $filter('split')(experience,',',0);
if(job.created_at == exp_val)
filtered.push(job)
}
});
return filtered;
}
})
在我的模板中
<div flex="20" flex-sm="100" ng-repeat="job in jobs | filterType: workType:experience:dateAdded:salary">
过滤工作如我所料,问题是假设如果我想使用过滤集进行过滤,我是否需要为其编写 if/else 语句集。好像是个很长的作品..
谁能建议最好的解决方法???????
你可以这样做:
.filter('filterType', function($filter) {
return function(jobs,workType,experience,dateAdded,salary) {
var filtered = Array.prototype.slice.apply(jobs); // make a copy of the array
if(!workType && !experience && !dateAdded && !salary){
return filtered;
}
if(workType){
filtered = $filter('filter')(filtered, {type: workType});
}
if(experience){
//filter by experience, like workType
}
if(dateAdded){
// filter by date, like workType
}
// ... other filters
return filtered;
}
})
.filter('filterType', function($filter) {
// Create the return function
// set the required parameter name to **params**
return function(jobs,wT,exp,dA,sal) {
var filtered =[];
var multiple = false;
if(!wT && !exp && !dA && !sal)
return jobs;
if(wT){
var val = multiple ? filtered : jobs;
var filtered_wT = [];
angular.forEach(val,function(job){
if(job.type == wT)
filtered_wT.push(job);
});
filtered = filtered_wT;
multiple = true;
}
if(exp){
var exp_val = $filter('split')(exp,',',0);
var filtered_exp = [];
var val = multiple ? filtered : jobs;
angular.forEach(val,function(job){
if(job.experience == exp_val)
filtered_exp.push(job);
});
filtered = filtered_exp;
multiple = true;
}
if(dA){
var val = multiple ? filtered : jobs;
var filtered_dA = [];
angular.forEach(val,function(job){
var date_field = $filter('pastDay')(job.created_at);
if(dA == date_field)
filtered_dA.push(job);
});
filtered = filtered_dA;
multiple = true;
}
if(sal){
var filtered_sal = [];
angular.forEach(jobs,function(job){
var min_sal = $filter('split')(sal,'-',0);
var max_sal = $filter('split')(sal,'-',1);
if(min_sal >= job.minsalary && max_sal <= job.maxsalary)
filtered_sal.push(job);
});
filtered = filtered_sal;
multiple = true;
}
return filtered;
}
})