2

ng-repeat を使用して、配列に基づいて行を繰り返すシンプルなテーブルを作成しました。この例のようなフィルターを追加しました。

ネストされたオブジェクトをフィルタリングしようとすると、問題が発生します。これは常に単一のオブジェクトであり、基本的に現在のオブジェクトの親ですが、FK 値だけではなく完全なオブジェクトです。

filterText.educationCenter.name を使用すると、すべての行がテーブルから除外され、フィルターをクリアしても返されません。完全にリロードする必要があります。

filterText.educationCenter だけでフィルタリングすると機能しますが、オブジェクト全体のすべてのフィールドを検索します。

JSON をそのままにして、educationCenter オブジェクトの名前に基づいてテーブルの結果をフィルター処理したいと思います。

私のHTML

Search: <input ng-model="filterText.$"/>
<input ng-model="filterText.city"/>
<input ng-model="filterText.educationCenter.name"/>

<tr ng-repeat="course in courses | filter:filterText | startFrom:currentPage*pageSize | limitTo:pageSize">
                    <td width="145">{{course.city}}</td>
                    <td width="145">{{course.educationCenter.name}}</td>
...

配列からの単一のオブジェクトに対する私の JSON

{"id":"108"
,"city":"My City"
,"educationCenter":{"id":"3"
                   ,"description":"This is the ed center description"
                   ,"name":"test ed center 1"}
,"noOfDays":"1"}
4

1 に答える 1

0

@fastreload が示唆したように、独自のフィルターを作成する必要があると思います。

再帰フィルタのサンプルを次に示します。$(ただし、記法はサポートしていません。エッジ ケースのサポートが欠落していると確信しています。)

app.filter('recursiveFilter', function() {
  var compare = function(input_, cond_) {
    if (!cond_) return true;
    if (typeof input_ == "string" && typeof cond_ == "string") {
      return (new RegExp(cond_)).test(input_);
    } else if (typeof input_ == "object" && typeof cond_ == "object") {
      for (var s in cond_) {
        if (!compare(input_[s], cond_[s])) return false;
      }
      return true;
    }
    return false;
  };

  return function(inputs, cond) {
    return $.grep(inputs, function(input) {
      return compare(input, cond);
    });
  };
});
于 2012-11-28T07:40:13.730 に答える