Di dalam pengontrol saya, saya ingin memfilter berbagai objek. Masing-masing objek ini adalah peta yang dapat berisi string serta daftar
Saya mencoba menggunakan $filter('filter')(array, function)
format tetapi saya tidak tahu cara mengakses elemen individual array di dalam fungsi saya. Berikut ini potongan untuk menunjukkan apa yang saya inginkan.
$filter('filter')(array, function() {
return criteriaMatch(item, criteria);
});
Dan kemudian di criteriaMatch()
, saya akan memeriksa apakah masing-masing properti individu cocok
var criteriaMatch = function(item, criteria) {
// go thro each individual property in the item and criteria
// and check if they are equal
}
Saya harus melakukan semua ini di controller dan menyusun daftar daftar dan mengaturnya dalam ruang lingkup. Jadi saya hanya perlu mengakses dengan $filter('filter')
cara ini. Semua contoh yang saya temukan di internet sejauh ini memiliki pencarian kriteria statis di dalam fungsi, mereka tidak lulus objek kriteria dan menguji setiap item dalam array.
sumber
Jawaban:
Anda dapat menggunakannya seperti ini: http://plnkr.co/edit/vtNjEgmpItqxX5fdwtPi?p=preview
Seperti yang Anda temukan,
filter
terima fungsi predikat yang menerima item demi item dari array. Jadi, Anda hanya perlu membuat fungsi predikat berdasarkan yang diberikancriteria
.Dalam contoh ini,
criteriaMatch
adalah fungsi yang mengembalikan fungsi predikat yang cocok dengan yang diberikancriteria
.template:
<div ng-repeat="item in items | filter:criteriaMatch(criteria)"> {{ item }} </div>
cakupan:
$scope.criteriaMatch = function( criteria ) { return function( item ) { return item.name === criteria.name; }; };
sumber
filter
metode asli dalam objek Array:array.filter(function(item){return item.name === criteria.name;})
Berikut adalah contoh bagaimana Anda akan menggunakan
filter
dalam AngularJS JavaScript Anda (bukan dalam elemen HTML).Dalam contoh ini, kami memiliki larik data Negara, masing-masing berisi nama dan kode ISO 3 karakter.
Kami ingin menulis fungsi yang akan mencari melalui daftar ini untuk sebuah record yang cocok dengan kode 3 karakter tertentu.
Inilah cara kami melakukannya tanpa menggunakan
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, tidak ada yang salah dengan itu.
Tapi begini tampilan fungsi yang sama, menggunakan
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]; };
Jauh lebih rapi.
Ingatlah bahwa
filter
mengembalikan sebuah array sebagai hasil (daftar record yang cocok), jadi dalam contoh ini, kita ingin mengembalikan 1 record, atau NULL.Semoga ini membantu.
sumber
Selain itu, jika Anda ingin menggunakan filter di pengontrol Anda dengan cara yang sama seperti yang Anda lakukan di sini:
<div ng-repeat="item in items | filter:criteriaMatch(criteria)"> {{ item }} </div>
Anda bisa melakukan sesuatu seperti:
var filteredItems = $scope.$eval('items | filter:filter:criteriaMatch(criteria)');
sumber
var filteredItems = $filter('criteriaMatch')(items, criteria);