Passando argumentos para filtros angularjs

É possível passar um argumento para a function de filtro para que você possa filtrar por qualquer nome?

Algo como

$scope.weDontLike = function(item, name) { console.log(arguments); return item.name != name; }; 

Na verdade, há outra (talvez uma solução melhor) onde você pode usar o filtro nativo ‘filtro’ do angular e ainda passar argumentos para o seu filtro personalizado.

Considere o seguinte código:

 
  • {{friend.name}}
  • Para fazer isso funcionar, basta definir 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 function que tem seu parâmetro em seu escopo, bem como o item original vindo do filtro.

    Levei 2 dias para perceber que você pode fazer isso, ainda não vi essa solução em nenhum lugar.

    Verificação Polaridade reversa de um filtro angular.js 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 function de filtro (ao usar o filtro ‘filtro’). O que você teria que fazer é escrever um filtro personalizado, assim:

     .filter('weDontLike', function(){ return function(items, name){ var arrayToReturn = []; for (var i=0; i 

    Aqui está o jsFiddle: 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 function personalizada apenas para isso. Se você rewrite seu HTML como abaixo, ele funcionará:

     
    • {{friend.name}} {{friend.phone}}

    http://jsfiddle.net/ZfGx4/59/

    Você pode simplesmente fazer isso em Template

     {{amount |firstFiler:'firstArgument':'secondArgument' }} 

    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-se na resposta do pkozlowski.opensource e usando array's método de filtro embutido array's javascript array's uma solução melhorada 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 no 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 do HTML você enviará dados como: –

      

    Aqui estou enviando um object 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 dynamic de argumentos para filtrar, nesse caso você tem que usar argumentos para obter esses argumentos.

    Para uma demonstração de trabalho, clique aqui – passando vários argumentos para o filtro angular