Чи можна передавати аргумент функції фільтра, щоб ви могли фільтрувати за будь-яким ім'ям?
Щось на зразок
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Чи можна передавати аргумент функції фільтра, щоб ви могли фільтрувати за будь-яким ім'ям?
Щось на зразок
$scope.weDontLike = function(item, name) {
console.log(arguments);
return item.name != name;
};
Відповіді:
Насправді є ще одне (можливо, краще рішення), де ви можете використовувати власний фільтр '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"). Що ви повинні зробити, це написати спеціальний фільтр, як-от так:
.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>
filter:['Adam', 'john']
Ви можете просто так зробити в Шаблоні
<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 та використання array's
методу вбудованого JavaScript у фільтр попередньо розробленим рішенням може бути таке:
.filter('weDontLike', function(){
return function(items, name){
return items.filter(function(item) {
return item.name != name;
});
};
});
Ось посилання jsfiddle .
Більше про фільтр Array тут .
Ви можете передавати декілька аргументів кутовому фільтру!
Визначення моєї кутової програми та змінної рівня додатка -
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. Ви також можете надсилати будь-які дані, такі як рядок або число.
також ви можете передавати динамічну кількість аргументів для фільтрації; у цьому випадку вам потрібно використовувати аргументи, щоб отримати ці аргументи.
Для робочої демонстраційної програми перейдіть сюди - передаючи кілька аргументів кутовому фільтру
Ви можете просто використовувати | filter:yourFunction:arg
<div ng-repeat="group in groups | filter:weDontLike:group">...</div>
І в js
$scope.weDontLike = function(group) {
//here your condition/criteria
return !!group
}