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過濾器的優點是你可以在視圖方面使用它。你也可以在代碼中使用它,但是如何弄清楚它以及使用什麼語法可能是一件痛苦的事情。 –