Filtros AngularJS e filtro personalizado AngularJS com exemplo

⚡ Resumo Inteligente

Em AngularJS, um filtro formata o valor de uma expressão para exibição sem alterar os dados subjacentes. Os filtros integrados abrangem maiúsculas e minúsculas, números, moedas e JSON, enquanto um filtro personalizado lida com qualquer regra de formatação que o framework não forneça.

  • 🧾 Princípio fundamental: Um filtro transforma apenas o que a visualização exibe; o valor armazenado no objeto de escopo nunca é modificado.
  • ➖ Sintaxe do pipe: A barra vertical separa a expressão do nome do filtro, e os dois pontos passam um argumento para ela.
  • 🔤 Filtros de casos: Converter letras minúsculas e maiúsculas em uma string serve para exibi-la, e não existe filtro de capitalização no AngularJS.
  • 🔢 Número e moeda: O número limita as casas decimais, enquanto a moeda adiciona um símbolo específico da região ao valor.
  • 🛠️ Filtros personalizados: O registro de uma fábrica que retorna uma função cria um filtro reutilizável disponível em todo o módulo.
  • ⚡ A pureza importa: Um filtro deve retornar a mesma saída para a mesma entrada, porque o AngularJS armazena os resultados em cache e evita executar novamente filtros puros.

Filtros AngularJS e Filtros Personalizados

O que é filtro no AngularJS?

A Filtrar em AngularJS Ajuda a formatar o valor de uma expressão para exibição ao usuário sem alterar o valor original. Por exemplo, se você quiser que uma string seja exibida em minúsculas ou maiúsculas, pode fazer isso usando filtros. Filtros integrados, como 'minúsculas' e 'maiúsculas', retornam a string no formato solicitado, e existem outros filtros para números, moedas e JSON.

⚠️ Nota de versão: O AngularJS (versão 1.x) chegou ao fim de seu ciclo de vida em 31 de dezembro de 2021 e não receberá mais atualizações de segurança. Todas as informações abaixo permanecem válidas para a manutenção de aplicações AngularJS existentes; no Angular moderno, a mesma função é desempenhada por um pipe.

Os filtros são aplicados na visualização com o caractere de barra vertical (|). Antes de analisar cada um deles, é útil saber por que você escreveria o seu próprio.

Filtro de letras minúsculas em AngularJS

Este filtro recebe uma string e exibe todos os seus caracteres em letras minúsculas.

Abaixo, um controlador envia uma string para a visualização através do objeto de escopo, e um filtro a converte para minúsculas.

Filtro de letras minúsculas em AngularJS

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Event Registration</title>
</head>
<body>
<h1> Guru99 Global Event</h1>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>

<div ng-app="DemoApp" ng-controller="DemoController">
Tutorial Name : <input type="text" ng-model="tutorialName"><br>
This tutorial is {{tutorialName | lowercase}}
</div>

<script>
var app = angular.module('DemoApp', []);

app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialName = "Angular JS";
}]);
</script>
</body>
</html>

Code Explicação

  1. A string em maiúsculas e minúsculas “Angular JS” é colocada em uma variável membro chamada tutorialName no objeto de escopo.
  2. O símbolo de filtro (|) marca a saída para transformação, e o lowercase A palavra-chave aplica o filtro integrado que transforma toda a string em minúsculas.

⚠️ Correções aplicadas a todos os anúncios. Todos os seis exemplares originais compartilhavam três defeitos. chrset="UTF 8" não é um atributo ou codificação válido e agora é charset="UTF-8". angular-route.js carregado antes angular.min.js, que gerava um erro de módulo e nunca foi usado — foi removido, assim como a referência não utilizada ao jQuery. O texto também afirmava que o valor era “AngularJS”, enquanto o código definia “Angular JS”; o texto agora corresponde.

Saída:

Filtro de letras minúsculas em AngularJS

A sequência de caracteres com letras maiúsculas e minúsculas misturadas é renderizada inteiramente em minúsculas. A transformação inversa funciona da mesma maneira.

Filtro de maiúsculas em AngularJS

Este filtro é o oposto do filtro de letras minúsculas, exibindo todos os caracteres em maiúsculas.

Abaixo, um controlador envia uma string para a visualização através do objeto de escopo, e um filtro a converte para maiúsculas.

Filtro de maiúsculas em AngularJS

<!-- The head and library references are unchanged from the previous example -->
<div ng-app="DemoApp" ng-controller="DemoController">
Tutorial Name : <input type="text" ng-model="tutorialName"><br>
This tutorial is {{tutorialName | uppercase}}
</div>

<script>
app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialName = "Angular JS";
}]);
</script>

Code Explicação

  1. A string em maiúsculas e minúsculas “Angular JS” é colocada em tutorialName e anexado ao objeto de escopo.
  2. O símbolo de filtro (|) é seguido pelo uppercase palavra-chave, portanto o filtro integrado renderiza toda a string em maiúsculas.

⚠️ Correção: O texto original introduziu esta seção como "um exemplo de filtro de maiúsculas do AngularJS com a opção de minúsculas", o que está errado em ambos os sentidos. Esta seção demonstra o filtro de maiúsculas, e o AngularJS não possui nenhum filtro de maiúsculas — capitalizar apenas a primeira letra requer um filtro personalizado, cuja criação será mostrada nas seções posteriores.

Saída:

Filtro de maiúsculas em AngularJS

Os filtros de maiúsculas e minúsculas não recebem argumentos. O próximo filtro mostra como os dois pontos passam um parâmetro para um filtro.

Filtro de número em AngularJS

Este filtro formata um número e pode limitar a quantidade de casas decimais exibidas.

O exemplo abaixo usa o filtro de número para exibir um valor restrito a duas casas decimais. Um controlador envia o número para a visualização por meio do objeto de escopo, e o filtro é aplicado na visualização.

Filtro de número em AngularJS

<!-- The head and library references are unchanged -->
<div ng-app="DemoApp" ng-controller="DemoController">
This tutorialID is {{tutorialID | number:2}}
</div>

<script>
app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialID = 3.565656;
}]);
</script>

Code Explicação

  1. Um número com muitas casas decimais é armazenado em uma variável membro chamada tutorialID e anexado ao objeto de escopo.
  2. O símbolo de filtro (|) é seguido por number:2Os dois pontos passam um argumento e o 2 define duas casas decimais. O valor é arredondado para exibição, portanto 3.565656 aparece como 3.57, embora o escopo mantenha o número inteiro.

Saída:

Filtro de número em AngularJS

Formatar um número simples geralmente não é suficiente quando o valor representa dinheiro, que é o que o próximo filtro trata.

Filtro de moeda em AngularJS

Este filtro formata um número como um valor monetário, prefixando-o com um símbolo de moeda, como $.

No exemplo abaixo, um controlador envia um número para a visualização por meio do objeto de escopo, e o filtro de moeda é aplicado na visualização.

Filtro de moeda em AngularJS

<!-- The head and library references are unchanged -->
<div ng-app="DemoApp" ng-controller="DemoController">
This tutorial Price is {{tutorialprice | currency}}
</div>

<script>
app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorialprice = 20.56;
}]);
</script>

Code Explicação

  1. Um número é colocado em uma variável membro chamada tutorialprice e anexado ao objeto de escopo.
  2. O símbolo de filtro (|) é seguido pelo currency filtro.

⚠️ Correção: O texto original afirmava que a moeda "depende das configurações de idioma aplicadas à máquina". Isso não é verdade. O AngularJS usa a localidade incluída na biblioteca, en-US por padrão, portanto o símbolo é $ independentemente do sistema operacional. Carregue a versão correspondente. angular-locale_*.js arquivo, ou passe o símbolo diretamente: {{tutorialprice | currency:"£"}}.

Saída:

Filtro de moeda em AngularJS

Cadeias de caracteres e números são valores simples. O filtro integrado final lida com objetos inteiros.

Filtro JSON em AngularJS

Este filtro converte um objeto em um formato definido. JSON string, que é útil para inspecionar dados de escopo durante o desenvolvimento.

No exemplo abaixo, um controlador envia um objeto para a visualização por meio do objeto de escopo, e o filtro JSON é aplicado na visualização.

Filtro JSON em AngularJS

<!-- The head and library references are unchanged -->
<div ng-app="DemoApp" ng-controller="DemoController">
This tutorial is {{tutorial | json}}
</div>

<script>
app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorial = { TutorialID: 12, tutorialName: "Angular" };
}]);
</script>

Code Explicação

  1. Um objeto segurando TutorialID: 12 e tutorialName: "Angular" é colocado em uma variável membro chamada tutorial e anexado ao objeto de escopo.
  2. O símbolo de filtro (|) é seguido pelo json filtro, que serializa o objeto em texto JSON com recuo.

⚠️ Correção: O texto original descrevia esse valor como “um número” e como “uma string do tipo JSON”. Não é nenhum dos dois. É um JavaO objeto Script e o filtro JSON são responsáveis ​​por convertê-lo em uma string JSON para exibição.

Saída:

Filtro JSON em AngularJS

Esses cinco filtros abrangem os casos mais comuns. Quando nenhum deles produzir o resultado desejado, você poderá criar o seu próprio.

Filtro personalizado AngularJS

Às vezes, os filtros integrados do AngularJS não atendem aos requisitos de formatação da saída. Nesses casos, é possível criar um filtro personalizado do AngularJS que retorne a saída da maneira desejada.

Um filtro personalizado é registrado em um módulo e, em seguida, comporta-se exatamente como um filtro integrado. As seções a seguir abordam primeiro os filtros padrão, já que um filtro personalizado usa a mesma sintaxe de pipe, e depois mostram como criar um.

Como criar filtro personalizado em AngularJS

No exemplo abaixo, uma string passa do controlador para a visualização através do objeto de escopo, mas não deve ser exibido como está. Um filtro personalizado em AngularJS Acrescenta outra string e exibe o resultado final.

Crie filtro personalizado em AngularJS

<!-- The head and library references are unchanged -->
<div ng-app="DemoApp" ng-controller="DemoController">
This tutorial is {{tutorial | Demofilter}}
</div>

<script>
var app = angular.module('DemoApp', []);

// The factory runs once; the function it returns runs on every value
app.filter('Demofilter', function() {
  return function(input) {
    return input + " Tutorial";
  };
});

app.controller('DemoController', ['$scope', function($scope) {
  $scope.tutorial = "Angular";
}]);
</script>

Code Explicação

  1. A string “Angular” é colocada em uma variável membro chamada tutorial e anexado ao objeto de escopo.
  2. O AngularJS fornece o filter Método de registro usado para criar um filtro personalizado. 'Demofilter' é o nome atribuído a ele, e é a esse nome que a visualização se refere.
  3. Este é o formato padrão de um filtro personalizado: a função registrada é um fábrica retornando a função que realiza o trabalho. Essa função recebe o valor que está sendo filtrado como seu primeiro parâmetro e retorna o resultado — neste caso, a entrada com "Tutorial" anexado.
  4. O filtro é aplicado na visualização usando a mesma sintaxe de pipe que qualquer filtro integrado.

💡 Dica: Os nomes de filtros são convencionalmente escritos em minúsculas ou camelCase. 'Demofilter' funciona, mas um nome como appendTutorial A leitura fica mais agradável e evita conflitos com nomes predefinidos.

Saída:

Crie filtro personalizado em AngularJS

A palavra 'Tutorial' foi adicionada à string passada como argumento. tutorial variável. Este filtro sempre acrescenta o mesmo texto, cuja configuração será definida na próxima seção.

Como passar argumentos para um filtro personalizado

O filtro acima codifica o texto que anexa, portanto, só pode fazer uma coisa. Filtros integrados como number:2 Aceita um argumento após dois pontos, e um filtro personalizado também pode: cada parâmetro após o primeiro corresponde a um argumento separado por dois pontos na visualização.

O processo envolve três etapas: adicionar parâmetros depois input Na função retornada, forneça um valor padrão para qualquer item opcional, para que o filtro ainda funcione quando o argumento for omitido. Em seguida, passe os argumentos na visualização, separados por dois pontos.

app.filter('appendText', function() {
  return function(input, suffix, separator) {
    if (!input) { return input; }        // guard against undefined
    separator = typeof separator === 'undefined' ? ' ' : separator;
    return input + separator + suffix;
  };
});

A visualização passa a ser a seguinte, onde “Tutorial” se torna suffix e o hífen se torna separator.

{{tutorial | appendText:"Tutorial"}}          // Angular Tutorial
{{tutorial | appendText:"Tutorial":" - "}}    // Angular - Tutorial

Dois detalhes são fáceis de passar despercebidos. Os argumentos são expressões do AngularJS, portanto, uma string literal deve ser colocada entre aspas, enquanto uma palavra sem aspas é lida como uma propriedade de escopo. Os filtros também são encadeados, cada um recebendo a saída do anterior: {{tutorial | appendText:"Tutorial" | uppercase}}.

⚠️ Atenção: Mantenha um filtro puro — mesma saída para a mesma entrada, sem alterações externas. O AngularJS armazena em cache um filtro puro e o executa novamente apenas quando a entrada muda. Um filtro que lê o relógio ou modifica um serviço deve ser marcado. $stateful, que desativa esse cache e executa o filtro a cada ciclo de digestão, uma causa comum de páginas lentas.

Os filtros não se restringem a modelos. O mesmo filtro pode ser chamado a partir de JavaRoteiro, conforme mostrado a seguir.

Como usar filtros em um controlador com o serviço $filter

Aplicar um filtro na view é o caso mais comum, mas o valor transformado às vezes é necessário dentro do controller, por exemplo, antes de enviar dados para um servidor. O AngularJS expõe todos os filtros registrados, tanto os integrados quanto os personalizados, através do $filter serviço. Injete-o, chame-o com o nome do filtro para recuperar a função de filtro e, em seguida, invoque-a com o valor e quaisquer argumentos.

app.controller('DemoController', ['$scope', '$filter',
function($scope, $filter) {
  $scope.tutorial = "Angular";

  // Built-in filters, called from JavaScript
  $scope.shouted = $filter('uppercase')($scope.tutorial);      // "ANGULAR"
  $scope.price   = $filter('currency')(20.56);                 // "$20.56"

  // A custom filter works exactly the same way
  $scope.full    = $filter('appendText')($scope.tutorial, "Tutorial");
}]);

Existe também uma forma mais curta: injetar o nome do filtro seguido de Filter, como uppercaseFilter, fornece a função de filtro diretamente e pode ser chamada imediatamente. Ambas as formas resultam na mesma função, portanto a escolha é estilística.

Dois usos surgem repetidamente. O primeiro é a preparação de uma carga útil: normalmente, uma data precisa chegar a uma API seguindo um padrão fixo, e $filter('date')(value, 'yyyy-MM-dd') produz o valor sem alterar o valor vinculado ao formulário. A segunda opção consiste em restringir uma coleção uma única vez no controlador, em vez de deixá-la como está. orderBy num ng-repetir expressão onde ela é executada novamente a cada resumo.

Os filtros injetados dessa forma ainda são registrados no módulo, portanto, um filtro personalizado deve ser declarado com app.filter antes que qualquer controlador pergunte $filter Caso contrário, o AngularJS gera um erro de provedor desconhecido.

Chamando um filtro em JavaUm script difere de um modelo em um aspecto importante: o resultado é calculado uma única vez e armazenado no escopo, em vez de ser recalculado a cada digest. Isso o torna a opção mais rápida para um valor que raramente muda e a opção errada para um que precisa mudar. track entrada do usuário.

Perguntas Frequentes

Não. O AngularJS fornece apenas letras minúsculas e maiúsculas. Para colocar a primeira letra de cada palavra em maiúscula, é necessário um filtro personalizado que divide a string e a reconstrói, ou uma regra CSS de transformação de texto, caso a alteração seja puramente visual.

O filtro está registrado em um módulo diferente daquele inicializado pelo ng-app, ou o script que o define é executado antes do carregamento do AngularJS. Registre o filtro no mesmo módulo e carregue a biblioteca primeiro.

Sim. Piping uma coleção dentro ng-repetir Filtra ou ordena os itens antes de serem renderizados. O filtro recebe o array completo e deve retornar um array.

Sim. Travas deslizantes portáteis AI Os assistentes geram a fábrica, a função retornada e a sintaxe da visualização a partir de uma descrição simples da regra de formatação. Verifique se o filtro gerado protege contra entradas indefinidas.

As ferramentas de IA reescrevem a fábrica como uma classe que implementa PipeTransform e movem cada parâmetro extra para o método transform. RevNão é possível visualizar manualmente nenhum filtro com estado, pois os pipes impuros devem ser declarados explicitamente.

Resuma esta postagem com: