AngularJSカスタムフィルター関数


91

コントローラ内で、オブジェクトの配列をフィルタリングしたいと思います。これらの各オブジェクトは、文字列とリストを含むことができるマップです

$filter('filter')(array, function)format を使用してみましたが、関数内の配列の個々の要素にアクセスする方法がわかりません。ここに私が欲しいものを示すスニペットがあります。

$filter('filter')(array, function() {
  return criteriaMatch(item, criteria);
});

次に、criteriaMatch()で、個々のプロパティのそれぞれが一致するかどうかを確認します

var criteriaMatch = function(item, criteria) {
  // go thro each individual property in the item and criteria
  // and check if they are equal
}

これらすべてをコントローラーで実行し、リストのリストをコンパイルしてスコープに設定する必要があります。したがって、私は$filter('filter')この方法でのみアクセスする必要があります。これまでにネットで見つけたすべての例では、関数内に静的基準検索があり、基準オブジェクトを渡さず、配列内の各項目に対してテストしていません。


3
なぜフィルターが必要なのですか?通常、フィルターはテンプレートから使用されます。あなたがそこからそれを使用しているだけなら、あなたはあなたのコントローラーに単純な機能を持たせることはできませんか?
ケタン2013年

配列の各要素を手動で実行する代わりに、angularの$ filter( 'filter')機能を使用できると思いました(述語関数を指定するだけで各要素の反復処理が行われます)
user2368436

回答:


173

次のように使用できます:http : //plnkr.co/edit/vtNjEgmpItqxX5fdwtPi?p=preview

あなたが見つけたようにfilter、配列から項目ごとに受け入れる述語関数を受け入れます。したがって、指定されたに基づいて述語関数を作成する必要がありますcriteria

この例でcriteriaMatchは、は、指定されたに一致する述語関数を返す関数criteriaです。

テンプレート:

<div ng-repeat="item in items | filter:criteriaMatch(criteria)">
  {{ item }}
</div>

範囲:

$scope.criteriaMatch = function( criteria ) {
  return function( item ) {
    return item.name === criteria.name;
  };
};

私はhtmlからこのcriteriaMatch関数を使用しません。コントローラーの内部からどのように呼び出しますか?$ filter( 'filter')(array、function(){return criteriaMatch(item、criteria);});
user2368436 2013年

6
テンプレートで使用していない場合、フィルターを定義してもメリットはありません。単純なjavascript関数を定義することもできます。あなたはネイティブ使用することができfilterArrayオブジェクトにメソッドを:array.filter(function(item){return item.name === criteria.name;})
トッシュ

私はJavaScript関数を持っています。角度がそれを行う簡単な方法を持っていなかったことを確認したかっただけです。私はあなたの答えを受け入れます。どうも。
user2368436 2013年

2

これfilterは、(HTML要素ではなく)AngularJS JavaScript内での使用例です。

この例では、Countryレコードの配列があり、それぞれに名前と3文字のISOコードが含まれています。

このリストを検索して、特定の3文字のコードに一致するレコードを検索する関数を記述します。

以下に使用せずにそれ行う方法を示しますfilter

$scope.FindCountryByCode = function (CountryCode) {
    //  Search through an array of Country records for one containing a particular 3-character country-code.
    //  Returns either a record, or NULL, if the country couldn't be found.
    for (var i = 0; i < $scope.CountryList.length; i++) {
        if ($scope.CountryList[i].IsoAlpha3 == CountryCode) {
            return $scope.CountryList[i];
        };
    };
    return null;
};

うん、それは何も悪いことではない。

しかし、これは同じ関数がどのように見えるかを使用したものfilterです:

$scope.FindCountryByCode = function (CountryCode) {
    //  Search through an array of Country records for one containing a particular 3-character country-code.
    //  Returns either a record, or NULL, if the country couldn't be found.

    var matches = $scope.CountryList.filter(function (el) { return el.IsoAlpha3 == CountryCode; })

    //  If 'filter' didn't find any matching records, its result will be an array of 0 records.
    if (matches.length == 0)
        return null;

    //  Otherwise, it should've found just one matching record
    return matches[0];
};

かなりすっきり。

ことを覚えておいてくださいfilter結果(一致するレコードのリスト)として戻っ配列は、ので、この例では、我々はどちらか1つのレコード、またはNULLを返すようにしたいでしょう。

お役に立てれば。


0

さらに、ここで行うのと同じ方法でコントローラーでフィルターを使用する場合:

<div ng-repeat="item in items | filter:criteriaMatch(criteria)">
  {{ item }}
</div>

あなたは次のようなことをすることができます:

var filteredItems =  $scope.$eval('items | filter:filter:criteriaMatch(criteria)');

6
またはvar filteredItems = $filter('criteriaMatch')(items, criteria);
321zeno 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.