2013-05-10 51 views
76

Bên trong bộ điều khiển của mình, tôi muốn lọc một mảng các đối tượng. Mỗi đối tượng này là một bản đồ có thể chứa chuỗi cũng như danh sáchAngularJS chức năng lọc tùy chỉnh

Tôi đã thử sử dụng định dạng $filter('filter')(array, function) nhưng tôi không biết cách truy cập các phần tử riêng lẻ của mảng bên trong chức năng của mình. Đây là một đoạn trích để thể hiện những gì tôi muốn.

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

Và sau đó trong criteriaMatch(), tôi sẽ kiểm tra nếu mỗi người trong số tài sản cá nhân phù hợp với

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

tôi phải làm tất cả những trong bộ điều khiển và biên soạn một danh sách liệt kê và đặt chúng trong phạm vi. Vì vậy, tôi chỉ cần truy cập $filter('filter') theo cách này. Tất cả các ví dụ tôi tìm thấy trong mạng cho đến nay có các tiêu chí tĩnh tìm kiếm bên trong hàm, chúng không vượt qua một đối tượng tiêu chí và kiểm tra đối với mỗi mục trong mảng.

+3

Tại sao bạn cần bộ lọc? Thông thường các bộ lọc được sử dụng từ các mẫu. Bạn có thể không chỉ có một chức năng đơn giản trong bộ điều khiển của bạn nếu bạn chỉ sử dụng nó từ đó? – Ketan

+0

thay vì tự chuyển qua từng phần tử của mảng, tôi nghĩ chúng tôi có thể sử dụng chức năng $ filter ('filter') của góc (sẽ xử lý việc lặp lại từng phần tử nếu chúng ta chỉ định hàm vị ngữ) – user2368436

Trả lời

154

Bạn có thể sử dụng nó như thế này: http://plnkr.co/edit/vtNjEgmpItqxX5fdwtPi?p=preview

Cũng giống như bạn tìm thấy, filter chấp nhận chức năng làm vị mà chấp nhận mục bởi mục từ mảng. Vì vậy, bạn chỉ cần tạo một hàm vị ngữ dựa trên criteria đã cho.

Trong ví dụ này, criteriaMatch là hàm trả về hàm vị trí phù hợp với criteria nhất định.

mẫu:

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

phạm vi:

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

Tôi sẽ không được sử dụng chức năng này tiêu chuẩnMatch từ html .. làm thế nào tôi sẽ gọi nó từ bên trong bộ điều khiển này là chính xác? $ filter ('filter') (mảng, hàm() {return criteriaMatch (mục, tiêu chí);}); – user2368436

+5

Nếu bạn không sử dụng nó trong mẫu của mình, việc xác định bộ lọc không mang lại cho bạn bất kỳ lợi thế nào. Bạn có thể chỉ cần định nghĩa một hàm javascript đơn giản, vì nó thậm chí còn ngắn hơn ở đó. Bạn có thể sử dụng phương thức 'filter' nguyên gốc trong đối tượng Array:' array.filter (function (item) {return item.name === criteria.name;}) ' – Tosh

+0

Tôi có một hàm javascript. chỉ muốn đảm bảo rằng góc cạnh không có cách dễ dàng hơn để làm điều đó .. tôi sẽ chấp nhận câu trả lời của bạn. cám ơn. – user2368436

0

Ngoài ra, nếu bạn muốn sử dụng bộ lọc trong điều khiển của bạn giống như cách bạn làm điều đó ở đây:

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

Bạn có thể làm điều gì đó như:

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

Hoặc, 'var filterItems = $ filter ('criteriaMatch') (mục, tiêu chí);' – 321zeno

2

Dưới đây là ví dụ về cách bạn muốn sử dụng filter trong JavaScript AngularJS của bạn (chứ không phải trong phần tử HTML).

Trong ví dụ này, chúng tôi có một mảng Bản ghi quốc gia, mỗi bản ghi chứa tên và mã ISO gồm 3 ký tự.

Chúng tôi muốn viết một chức năng sẽ tìm kiếm thông qua danh sách này cho bản ghi khớp với mã gồm 3 ký tự cụ thể.

Đây là cách chúng tôi làm điều đó mà không sử dụng 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; 
}; 

Yup, không có gì sai với điều đó.

Nhưng dưới đây là cách các chức năng tương tự sẽ trông, sử dụng 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]; 
}; 

Hầu gọn gàng.

Hãy nhớ rằng filter trả về kết quả là một mảng (danh sách các bản ghi phù hợp), vì vậy trong ví dụ này, chúng tôi sẽ muốn trả lại 1 bản ghi hoặc NULL.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan