Reutilizando um filtro Angular.js - Exibir / Controlar
Esta solução está cobrindo a reutilização de filtros angulares. Essa é outra maneira de filtrar dados, e o Google me trouxe aqui quando eu precisei; e eu gosto de compartilhar
Caso de Uso
Se você já está filtrando, digamos em ng-repeat na sua visualização (como abaixo), então você pode ter definido um filtro no controlador da seguinte maneira. E então você pode reutilizar como nos exemplos finais.
Exemplo de uso de filtro - repetição filtrada na exibição
<div ng-app="someApp" ng-controller="someController">
<h2>Duplicates</h2>
<table class="table table-striped table-light table-bordered-light">
<thead>
<tr>
<th>Name</th>
<th>Gender</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="person in data | filter: searchDuplicate:true">
<td>{{person.name}}</td>
<td>{{person.gender}}</td>
</tr>
</tbody>
</table>
</div>
Exemplo de definição de filtro angular
angular.module('someApp',[])
.controller('someController', function($scope, $filter ) {
$scope.people = [{name: 'Bob', gender: 'male' , hasDuplicate: true },
{name: 'Bob', gender: 'male' , hasDuplicate: true },
{name: 'Bob', gender: 'female', hasDuplicate: false}];
$scope.searchDuplicate = { hasDuplicate : true };
})
Portanto, o conceito aqui é que você já está usando um filtro criado para sua visualização e, em seguida, percebe que também gostaria de usá-lo em seu controlador.
Utilização da função de filtro no exemplo 1 do controlador
var dup = $filter('filter')($scope.people, $scope.searchDuplicate, true)
Utilização da função de filtro no controlador Exemplo 2
Mostrar um botão apenas se nenhuma duplicata for encontrada, usando o filtro anterior.
Botão Html
<div ng-if="showButton()"><button class="btn btn-primary" ng-click="doSomething();"></button></div>
Botão Mostrar / Ocultar
$scope.doSomething = function(){ /* ... */ };
$scope.showButton = function(){ return $filter('filter')($scope.people, $scope.searchDuplicate, true).length == 0; };
Alguns podem achar essa versão da filtragem fácil, e é uma opção do Angular.js.
O parâmetro comparador opcional "true" usado na visualização e na chamada da função $ filter especifica que você deseja uma comparação estrita. Se você omitir, os valores podem ser pesquisados em várias colunas.
https://docs.angularjs.org/api/ng/filter/filter