0

グリッドのフィルタリング ソリューションに取り組んでいます。フィルターには、パネルに複数のチェックボックスが含まれています。現在、ng-repeat ディレクティブに組み込まれているフィルターを使用する実用的なソリューションがあります。ただし、複数のパラメーターを持つ単一のフィールドをフィルター処理する方法は見つかりませんでした。これは私が持っているものです:

HTML:

<tr data-ng-repeat="rule in rules | orderBy:sortOrder | filter:filterOrder">

コントローラ:

var defaultFilter = {critical:'', score:'', category:'', pass:'false'};
$scope.filterOrder = defaultFilter;

私が望むのは、次のようなことができることです:

var defaultFilter = {critical:'', score:'', category:'', pass:'false && notRun'};

これが可能かどうかはわかりません。その構文を探しましたが、まだ見つかりません。コントローラーに入れる方法があることは知っていますが、現在のプロジェクトのおかげで、この実装はかなり簡単になります。

4

2 に答える 2

3

1.0.x ブランチを使用していると仮定して、オブジェクトのフィルタリングに関連するソース コードの部分を以下の脚注に示します。これは、標準フィルターがテストするキーを見つけて、 をvar text = (''+expression[key]).toLowerCase();呼び出す前に検索条件から取得することを示していますsearchsearch次に、 ( を使用してテキスト検索を行いますindexOf(text) > -1

したがって、検索条件の項目の 1 つを、試みている方法で評価を必要とする式に設定することはできません。

他の唯一のオプションは次のとおりです。

  1. フィルターのパラメーターとして述語関数を使用します (これは true/false を返す必要があるだけです)。また
  2. 独自のフィルターを作成します (元の配列から新しい配列を返す必要があるだけです)。

述語関数

$scope.myFilterTest(item) { return ... true or false test result ...; }

と:

<tr data-ng-repeat="rule in rules | orderBy:sortOrder | filter:myFilterTest">

カスタムフィルター

var someApp=angular.module('myApp', []);

someApp.filter('complexFilter', function() {
  return function(input, criteria) {
    var result = [];
    for (var i = 0; i < input.length; i++) {
      if(... multiple tests ...){
        result.push(input[i]);
      }
    }
    return result;
  }
});

その後:

<tr data-ng-repeat="rule in rules | orderBy:sortOrder | complexFilter:filterOrder">

脚注:

src/ng/filter/filter.js の関連部分

  case "object":
    for (var key in expression) {
      if (key == '$') {
        (function() {
          var text = (''+expression[key]).toLowerCase();
          if (!text) return;
          predicates.push(function(value) {
            return search(value, text);
          });
        })();
      } else {
        (function() {
          var path = key;
          var text = (''+expression[key]).toLowerCase();
          if (!text) return;
          predicates.push(function(value) {
            return search(getter(value, path), text);
          });
        })();
      }
    }
    break;
于 2013-08-31T21:05:44.233 に答える