0

我正在使用复选框进行过滤,我的geojson具有状态属性。状态是值如下:如何在角度过滤器中包含“字符串包含”功能

状态 : “法3Q99”

状态 : “笏3Q99”

我需要按“Act”或“Fut”过滤。这里是我的过滤器:

function StatusFilter() { 

    return function (territorySubdivisions, typeFilter) { 
     var filtered = []; 
     angular.forEach(territorySubdivisions, function (subdivision) { 
      if (typeFilter.active == true && typeFilter.future == true) { 
       filtered.push(subdivision); 
      } 
      else if (typeFilter.active == true && typeFilter.future == false && subdivision.properties.status == subdivision.properties.status.indexOf('Act') != -1) { 
       filtered.push(subdivision); 
      } 
      else if (typeFilter.future == true && typeFilter.active == false && subdivision.properties.status == subdivision.properties.status.indexOf('Fut') != -1) { 
       filtered.push(subdivision); 
      } 
     }); 
     return filtered; 
    }; 
}; 

这里是我试过的。

subdivision.properties.status.indexOf( '法案')!= -1

这当然是行不通的。我创建了一个工作的重击者。我包括其他orderBy和筛选代码以确保没有冲突。

working plunker

<div class="col-xs-3"> 
      <div class="checkbox checkbox-success checkbox-inline"> 
       <input type="checkbox" id="active-checkbox-filter" ng-model="vm.typeFilter.active" ng-change="vm.statusActive('active')"> 
       <label for="active-checkbox-filter"> Active </label> 
      </div> 
     </div> 
     <div class="col-xs-3"> 
      <div class="checkbox checkbox-success checkbox-inline"> 
       <input type="checkbox" id="future-checkbox-filter" ng-model="vm.typeFilter.future" ng-change="vm.statusFuture('future')"> 
       <label for="future-checkbox-filter"> Future </label> 
      </div> 
     </div> 

回答

1

您的代码看起来很奇怪。你不只是需要这个:

if (typeFilter.active === true && typeFilter.future === true) { 
    filtered.push(subdivision); 
} else if (typeFilter.active === true && typeFilter.future === false && subdivision.properties.status.indexOf('Act') >= 0) { 
    filtered.push(subdivision); 
} else if (typeFilter.future === true && typeFilter.active === false && subdivision.properties.status.indexOf('Fut') >= 0) { 
    filtered.push(subdivision); 
} 

+0

看起来就是它 – texas697

+1

我还会将这些比较用布尔值更改为'booleanVariable'和'!booleanVariable'。 – mat3e

+0

你可以调整蹲跳者。感谢您的帮助 – texas697

3

这里的@伴侣的回答一些重构,主要是坚持“不重复自己”的原则:

var active = typeFilter.active; 
var future = typeFilter.future; 
var status = subdivision.properties.status; 

var match = (active && future) || 
      (active && !future && status.indexOf('Act') >= 0) || 
      (future && !active && status.indexOf('Fut') >= 0); 

if (match) { 
    filter.push(subdivision); 
} 

注意,一旦你有布尔match答案你可以只使用Array.filter反而产生你的结果,而不是积累与.push的结果 - 它支持MSIE 9+,所以它会在该AngularJS支持,减少上面的代码中的任何浏览器工作:

function StatusFilter() { 
    return function (territorySubdivisions, typeFilter) { 
     return territorySubdivisions.filter(function(subdivision) { 
      var active = typeFilter.active; 
      var future = typeFilter.future; 
      var status = subdivision.properties.status; 

      return (active && future) || 
        (active && !future && status.indexOf('Act') >= 0) || 
        (future && !active && status.indexOf('Fut') >= 0);   
     }); 
    } 
} 
+1

一旦产生了一个产生布尔值的表达式,就不再需要使用从过滤器返回数组的语法。布尔返回更清晰 - 与Array.filter()更类似。 –

+2

@AmyBlankenship我刚刚添加了一个关于自己的注释,检查了Array.filter是否与AngularJS本身具有相同的浏览器支持(虽然没有使用Angular自己的过滤器功能) – Alnitak

+0

使用AngularJS过滤器的优点是你可以在视图方面使用它。你也可以在代码中使用它,但是如何弄清楚它以及使用什么语法可能是一件痛苦的事情。 –