Можно ли передать аргумент функции фильтра, чтобы вы могли фильтровать любое имя?
Что-то вроде
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Можно ли передать аргумент функции фильтра, чтобы вы могли фильтровать любое имя?
Что-то вроде
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
На самом деле есть другое (может быть, лучшее решение), где вы можете использовать фильтр 'w500 > native' filter 'и все еще передавать аргументы вашему настраиваемому фильтру.
Рассмотрим следующий код:
<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 дня, чтобы понять, что вы можете это сделать, еще не видели этого решения.
Оформить Обратная полярность фильтра angular.js, чтобы узнать, как вы можете использовать это для других полезных операций с фильтром.
Из того, что я понимаю, вы не можете передать аргументы функции фильтра (при использовании фильтра "фильтр" ). То, что вам нужно сделать, это написать собственный фильтр, например:
.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 answer и используя встроенный фильтр javascript array's
, это может быть приманованное решение:
.filter('weDontLike', function(){
return function(items, name){
return items.filter(function(item) {
return item.name != name;
});
};
});
Здесь ссылка jsfiddle .
Подробнее о фильтре массива здесь.
Вы можете передать несколько аргументов в фильтр angular!
Определение моего приложения angular и и уровня приложения -
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 в фильтр. Вы также можете отправлять любые данные, такие как строка или номер.
также вы можете передавать динамическое количество аргументов для фильтрации, в этом случае вы должны использовать аргументы, чтобы получить эти аргументы.
Для рабочей демонстрации перейдите сюда - передача нескольких аргументов в angular фильтр