Javascript AngularJS 1 ng repeat中的多个真/假过滤器

Javascript AngularJS 1 ng repeat中的多个真/假过滤器,javascript,angularjs,filter,Javascript,Angularjs,Filter,我学习最好的方法是有一个“项目”去做。我正在通过制作一个高尔夫球场列表应用程序来学习angular 1.x。 我有一个json文件,用于所有数据。这个应用程序有一个通用的文本搜索,可以设置8个开关来过滤州的地区和高尔夫球场的类型。我的文本搜索功能很好。我破解了其中的一些代码,为“课程类型”制作了一个单独的过滤器,它实际上可以工作。但当我试着做第二个过滤器时,它就坏了。我将在下面发布我的代码,但它可能是黑客的 将八个真/假开关组合到一个或多个过滤器中,并将其与文本搜索相结合的最佳方法是什么?我想先

我学习最好的方法是有一个“项目”去做。我正在通过制作一个高尔夫球场列表应用程序来学习angular 1.x。 我有一个json文件,用于所有数据。这个应用程序有一个通用的文本搜索,可以设置8个开关来过滤州的地区和高尔夫球场的类型。我的文本搜索功能很好。我破解了其中的一些代码,为“课程类型”制作了一个单独的过滤器,它实际上可以工作。但当我试着做第二个过滤器时,它就坏了。我将在下面发布我的代码,但它可能是黑客的

将八个真/假开关组合到一个或多个过滤器中,并将其与文本搜索相结合的最佳方法是什么?我想先过滤,然后文本搜索过滤后的结果

html ng重复(如果我取出第二个“私有”过滤器,公共过滤器工作:

<div ng-repeat="course in items | searchFor:data.searchString | orderBy: 'name' | publicFilter:data.publicCourse | privateFilter:data.privateCourse " >
var-app=angular.module('app',[]);
应用控制器('mainController',功能($scope){
//数据对象
$scope.courses=[
{名称:'Course 1',courseType:'Public',地区:'Northern'},
{名称:'Course 2',courseType:'Public',地区:'Northern'},
{名称:'Course 3',courseType:'Private',地区:'Northern'},
{name:'Links 4',courseType:'Private',regionmode:'Northern'},
{名称:'Links 5',课程类型:'Private',地区:'Northern'},
{名称:'Links 6',课程类型:'Public',地区:'Southern'},
{名称:'Links 7',课程类型:'Public',地区:'Southern'},
{名称:'Links 8',课程类型:'Military',地区:'Southern'},
{名称:'Course 9',courseType:'Private',地区:'Southern'},
{名称:'Course 10',courseType:'Private',地区:'Southern'}
];
//过滤器默认值
$scope.Filter=新对象();
$scope.Filter.courseType={'public':'public',
“私人”:“私人”,
"军事":"军事"
};
$scope.Filter.region={'northern':'northern',
“南部”:“南部”
};
//默认顺序
$scope.OrderFilter='region';
});
//全局搜索过滤器
app.filter('searchFilter',函数($filter){
返回函数(项目、搜索过滤器){
var isSearchFilterEmpty=真;
angular.forEach(searchfilter,函数(searchstring){
if(searchstring!=null&&searchstring!=“”){
isSearchFilterEmpty=false;
}
});
如果(!isSearchFilterEmpty){
var结果=[];
forEach(项,函数(项){
var isFound=false;
forEach(项,函数(项,键){
if(term!=null&&!isFound){
term=term.toString();
term=term.toLowerCase();
angular.forEach(searchfilter,函数(searchstring){
searchstring=searchstring.toLowerCase();
if(searchstring!=“”&&term.indexOf(searchstring)!=-1&&!isFound){
结果:推送(项目);
isFound=true;
}
});
}
});
});
返回结果;
}否则{
退货项目;
}
}
});
正文{
字体系列:calibri,arial;
线高:1米;
}
氢{
字号:14pt;
字体大小:粗体;
}
李{
字体系列:信使;
}
th{
字体大小:粗体;
光标:指针;
}

搜索:
课程类型
公开的
私有的
军事的

区域 北方的 南方的
结果: 名称 课程类型 区域 {{course.name} {{course.courseType} {{course.region}
在angular 1.5.5中,我必须在双引号内用单引号格式化输入的真值和假值,以使其正常工作:

 <input type="checkbox" ng-model="Filter.courseType.public" ng-true-value="'public'" ng-false-value="'!public'" />


在您的
publicFilter
privateFilter
中,当条件不满足时,您不会返回任何内容。这是预期的行为吗?嗯,我不确定。我想可能会关闭所有筛选器,但没有结果。但是,我希望用户至少选择一个coursetype和一个region。F或者一直打开一个是可能的,但是讨论另一个问题。非常感谢。我即将开始工作,但看起来你的代码起了作用。今晚我将深入研究,并标记为已回答。K Scandrett:过滤器中的数组有点不同。不确定这是否重要。例如“区域”是键,有四个不同的值。与course type相同。courseType在数组中可以有四个不同的值。filter对象仅用于将复选框的初始值设置为true,否则筛选器将在初始时过滤掉所有内容。基本数据位于
$scope.courses
-where region中是具有多个值的键
区域模式:'Northern'
是一个输入错误。应该是
区域:'Northern'
角度1.5.x
ngTrueValue
的预期常量表达式,但saw
Northern
的预期常量表达式
ngTrueValue
,但saw
private
 <input type="checkbox" ng-model="Filter.courseType.public" ng-true-value="'public'" ng-false-value="'!public'" />