AngularJS自定义过滤器功能


91

在控制器内部,我想过滤对象数组。每个对象都是一个映射,可以包含字符串和列表

我尝试使用$filter('filter')(array, function)格式,但是我不知道如何访问函数内部数组的各个元素。这是显示我想要的内容的摘要。

$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
为什么需要过滤器?通常,从模板使用过滤器。如果仅从控制器中使用普通功能,您是否可以仅在其中使用普通功能?
Ketan

而不是手动遍历数组的每个元素,我认为我们可以使用angular的$ filter('filter')功能(如果仅指定谓词功能,它将遍历每个元素)
user2368436

Answers:


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(){返回criteriaMatch(item,条件);});
user2368436 2013年

6
如果您不在模板中使用它,则定义过滤器不会给您带来任何好处。您可以简单地定义一个简单的javascript函数,因为它在那里更短。您可以filter在Array对象中使用本机方法:array.filter(function(item){return item.name === criteria.name;})
Tosh

我确实有一个javascript函数。只是想确保angular没有更简单的方法即可。.我会接受您的回答。谢谢。
user2368436

2

这是一个如何filter在AngularJS JavaScript中(而不是在HTML元素中)使用的示例。

在此示例中,我们有一个国家/地区记录数组,每个记录包含一个名称和一个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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.