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 2013 년

배열의 각 요소를 수동으로 처리하는 대신 angular의 $ filter ( 'filter') 기능을 사용할 수 있다고 생각했습니다 (조건 자 함수 만 지정하면 각 요소를 반복하는 작업을 처리합니다)
user2368436

답변:


174

다음과 같이 사용할 수 있습니다. http://plnkr.co/edit/vtNjEgmpItqxX5fdwtPi?p=preview

찾은 것처럼 filter배열에서 항목별로 항목을 받아들이는 조건 자 함수를 허용합니다. 따라서 주어진 .NET Framework를 기반으로 조건 자 함수를 만들어야합니다 criteria.

이 예제에서는 criteriaMatch주어진 .NET과 일치하는 조건 자 함수를 반환하는 함수입니다 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

6
템플릿에서 사용하지 않는 경우 필터를 정의해도 이점이 없습니다. 더 짧기 때문에 간단한 자바 스크립트 함수를 간단히 정의 할 수 있습니다. filterArray 객체에서 네이티브 메서드를 사용할 수 있습니다 .array.filter(function(item){return item.name === criteria.name;})
Tosh

나는 자바 스크립트 기능이 있습니다. 앵귤러가 더 쉬운 방법이 없는지 확인하고 싶었습니다. 대답을 수락하겠습니다. 고마워.
user2368436 2013 년

2

다음은 filterAngularJS 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.