Javascript 角度JS过滤器或语句

Javascript 角度JS过滤器或语句,javascript,angularjs,angular-filters,Javascript,Angularjs,Angular Filters,我对项目有一个重复声明。然后我有一个下拉列表,选择项目所在的区域。我有它的工作,如果它是一个单一的地区,但我需要检查在多个地区的项目。例如,他们选择了非洲和北美 <div class="column project-thumbnail" data-ng-repeat="project in projects | orderBy:livePredicate:'title' | filter:liveRegion:'region'> 我试着给它传递一个对象,我也试过在另一篇文章中看

我对项目有一个重复声明。然后我有一个下拉列表,选择项目所在的区域。我有它的工作,如果它是一个单一的地区,但我需要检查在多个地区的项目。例如,他们选择了非洲和北美

<div class="column project-thumbnail" data-ng-repeat="project in   projects | orderBy:livePredicate:'title' | filter:liveRegion:'region'>
我试着给它传递一个对象,我也试过在另一篇文章中看到的,关于一个函数的传递方式如下:

$scope.showMovie = function(movie){
return movie.genre === $scope.Filter.Comedy || 
    movie.genre === $scope.Filter.Drama ||
    movie.genre === $scope.Filter.Action;

非常感谢您的任何建议或帮助。该对象有一个与之比较的project.region,并且可以有任意数量的值。因此,我想显示任何选定的区域。

我还没有尝试过,但我相信您应该能够将一个数组传递给自定义筛选器,并在其中应用筛选器逻辑。如下所示:

angular.module('app', []).
filter('regionFilter', function () {
    return function (projects, regions) {
        var filteredProjects=[]
        angular.forEach(projects, function (project) {
            if (regions.indexOf(project.region)>=0) {
                filteredProjects.push(value);
            }
        });
        return filteredProjects;
    };
});


其中区域是要作为筛选条件的选定区域的数组


另一方面,您对orderBy的语法似乎是错误的。它应该像
{{orderBy_expression | orderBy:expression:reverse}}

您的解决方案可能类似于构建一个自定义过滤器

因此,如果您有一个可能的标准列表,用“,”分隔(又名csv)

.filter('csvFilter',function(){
返回函数(数据、csv、字段){
返回数据。过滤器(函数(d){
如果(!csv)返回true;
var csvArr=csv.split(',');
对于(变量i=0;i
此过滤器使用javascript avnilla filter()函数

请参见JSFIDLE中的:

更好的解决方案

在角度阵列中使用复杂过滤器可能会降低性能。在这种情况下,我建议使用带有ng hide的简单条件:

html

 <ul ng-repeat="project in ctrl.projects">
    <li ng-show="ctrl.condition(project.region)">{{project.name}}</li>
</ul>
  • {{{project.name}
javascript

 this.condition = function(field) {
        if (!this.filter) return true;
        var csvArr = this.filter.split(',');
        for (var i = 0; i < csvArr.length; i++) {
            if (field === csvArr[i])
                return true;
        }
        return false;
    }
this.condition=函数(字段){
如果(!this.filter)返回true;
var csvArr=this.filter.split(',');
对于(变量i=0;i

可能的解决方案是创建一个自定义过滤器:谢谢您的支持,但我也尝试了。仅返回第一个对象,而不是两个对象都匹配
 .filter('csvFilter', function() {
    return function(data, csv, field) {
        return data.filter(function(d) {
            if (!csv) return true;
            var csvArr = csv.split(',');
            for (var i = 0; i < csvArr.length; i++) {
                if (d[field] === csvArr[i])
                    return true;
            }
            return false;
        });
    }
})
 <ul ng-repeat="project in ctrl.projects">
    <li ng-show="ctrl.condition(project.region)">{{project.name}}</li>
</ul>
 this.condition = function(field) {
        if (!this.filter) return true;
        var csvArr = this.filter.split(',');
        for (var i = 0; i < csvArr.length; i++) {
            if (field === csvArr[i])
                return true;
        }
        return false;
    }