Respostas:
Na verdade, há outra (solução talvez melhor) onde você pode usar o filtro 'filtro' nativo do angular e ainda passar argumentos para o seu filtro personalizado.
Considere o seguinte código:
<div ng-repeat="group in groups">
<li ng-repeat="friend in friends | filter:weDontLike(group.enemy.name)">
<span>{{friend.name}}</span>
<li>
</div>
Para fazer isso funcionar, você apenas define seu filtro da seguinte forma:
$scope.weDontLike = function(name) {
return function(friend) {
return friend.name != name;
}
}
Como você pode ver aqui, weDontLike na verdade retorna outra função que tem o seu parâmetro em seu escopo, bem como o item original proveniente do filtro.
Levei 2 dias para perceber que você pode fazer isso, ainda não vi essa solução em lugar nenhum.
Caixa inversão de polaridade de um filtro angularjs para ver como você pode usar isso para outras operações úteis com filtro.
Pelo que entendi você não pode passar argumentos para uma função de filtro (ao usar o filtro 'filtro'). O que você teria que fazer é escrever um filtro personalizado, parecido com este:
.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;
};
Aqui está o jsFiddle funcional: http://jsfiddle.net/pkozlowski_opensource/myr4a/1/
A outra alternativa simples, sem escrever filtros personalizados, é armazenar um nome para filtrar em um escopo e, em seguida, escrever:
$scope.weDontLike = function(item) {
return item.name != $scope.name;
};
Na verdade você pode passar um parâmetro ( http://docs.angularjs.org/api/ng.filter:filter ) e não precisa de uma função customizada apenas para isso. Se você reescrever seu HTML como a seguir, funcionará:
<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']
Você pode simplesmente fazer assim No modelo
<span ng-cloak>{{amount |firstFiler:'firstArgument':'secondArgument' }}</span>
No filtro
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";
}
});
Estendendo a resposta de pkozlowski.opensource e usando o array's
método de filtro embutido javascript , uma solução aprimorada poderia ser esta:
.filter('weDontLike', function(){
return function(items, name){
return items.filter(function(item) {
return item.name != name;
});
};
});
Aqui está o link jsfiddle .
Mais sobre o filtro Array aqui .
Você pode passar vários argumentos para o filtro angular!
Definindo meu aplicativo angular e uma variável de nível de aplicativo -
var app = angular.module('filterApp',[]);
app.value('test_obj', {'TEST' : 'test be check se'});
Seu filtro será como: -
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;
}]);
E de HTML você enviará dados como: -
<span ng-bind="'TEST' | testFilter: { 'be': val, 'se': value2 }"></span>
Aqui estou enviando um objeto JSON para o filtro. Você também pode enviar qualquer tipo de dados como string ou número.
também você pode passar um número dinâmico de argumentos para filtrar; nesse caso, você deve usar argumentos para obter esses argumentos.
Para uma demonstração de trabalho, vá aqui - passando vários argumentos para o filtro angular
Você pode simplesmente usar | filter:yourFunction:arg
<div ng-repeat="group in groups | filter:weDontLike:group">...</div>
E em js
$scope.weDontLike = function(group) {
//here your condition/criteria
return !!group
}