Передача аргументов в фильтры angularjs
можно ли передать аргумент функции фильтра, чтобы вы могли фильтровать по любому имени?
что-то вроде
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
6 ответов:
На самом деле есть еще одно (возможно, лучшее решение), где вы можете использовать собственный фильтр "фильтр" angular и по-прежнему передавать аргументы в свой пользовательский фильтр.
рассмотрим следующий код:
<div ng-repeat="group in groups"> <li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)"> <span>{{friend.name}}</span> <li> </div>
чтобы сделать эту работу, вы просто определяете свой фильтр следующим образом:
$scope.weDontLike = function(name) { return function(friend) { return friend.name != name; } }
как вы можете видеть здесь, weDontLike фактически возвращает другую функцию, которая имеет ваш параметр в своей области, а также исходный элемент, поступающий из фильтр.
мне потребовалось 2 дня, чтобы понять, что вы можете это сделать, еще нигде не видели этого решения.
оформить заказ обратная полярность угловой.фильтр Яш чтобы увидеть, как вы можете использовать это для других полезных операций с фильтром.
из того, что я понимаю, вы не можете передать аргументы функции фильтра (при использовании фильтра "Фильтр"). То, что вам нужно сделать, это написать пользовательский фильтр, sth, как это:
.filter('weDontLike', function(){ return function(items, name){ var arrayToReturn = []; for (var i=0; i<items.length; i++){ if (items[i].name != name) { arrayToReturn.push(items[i]); } } return arrayToReturn; };
вот рабочий jsFiddle:http://jsfiddle.net/pkozlowski_opensource/myr4a/1/
другой простой альтернативой, без написания пользовательских фильтров, является сохранение имени для фильтрации в области, а затем запись:
$scope.weDontLike = function(item) { return item.name != $scope.name; };
на самом деле вы можете передать параметр (http://docs.angularjs.org/api/ng.filter:filter) и не нужна пользовательская функция только для этого. Если вы перепишете свой HTML, как показано ниже, он будет работать:
<div ng:app> <div ng-controller="HelloCntl"> <ul> <li ng-repeat="friend in friends | filter:{name:'!Adam'}"> <span>{{friend.name}}</span> <span>{{friend.phone}}</span> </li> </ul> </div> </div>
Вы можете просто сделать такой В Шаблоне
<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span>
фильтр
angular.module("app") .filter("firstFiler",function(){ console.log("filter loads"); return function(items, firstArgument,secondArgument){ console.log("item is ",items); // it is value upon which you have to filter console.log("firstArgument is ",firstArgument); console.log("secondArgument ",secondArgument); return "hello"; } });
площадью pkozlowski.ответ opensource и с помощью javascript
array's
встроенный метод фильтра усовершенствованное решение может быть следующим:.filter('weDontLike', function(){ return function(items, name){ return items.filter(function(item) { return item.name != name; }); }; });
вот jsfiddle ссылке.
подробнее о фильтре массива здесь.
вы можете передать несколько аргументов угловой фильтр !
определение моего углового приложения и переменной уровня приложения -
var app = angular.module('filterApp',[]); app.value('test_obj', {'TEST' : 'test be check se'});
ваш фильтр будет выглядеть так: -
app.filter('testFilter', [ 'test_obj', function(test_obj) { function test_filter_function(key, dynamic_data) { if(dynamic_data){ var temp = test_obj[key]; for(var property in dynamic_data){ temp = temp.replace(property, dynamic_data[property]); } return temp; } else{ return test_obj[key] || key; } } test_filter_function.$stateful = true; return test_filter_function; }]);
и из HTML вы будете отправлять данные, такие как :-
<span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span>
здесь я посылаю объект JSON в фильтр. Вы также можете отправить любые данные, такие как строка или число.
также вы можете пройти ряд аргументов для фильтрации , в этом случае вы должны использовать аргументы чтобы получить эти аргументы.
для рабочей демонстрации перейдите сюда - передача нескольких аргументов в угловой фильтр