Front End

28 jan, 2015

Série AngularJS: Filter ordenando tabela por coluna

Publicidade

Olá, pessoal!

Vamos ver hoje como ordenar os dados em ordem crescente ou decrescente por coluna quando for clicado. É bem simples fazer isso.

Para separar o exemplo do artigo anterior, apenas dupliquei o filteradvance2.html e criei uma nova rota. Então, o resultado dos exemplos mostrado no artigo você deve ver no arquivo filteradvance2.html.Veja como ficou a rota:

app.js 

when("/filteradvance2", {
		templateUrl : "filteradvance2.html", 
		controller:filterController
		}).

Abra o arquivo index.html e vamos adicionar bootstrap css no head:

<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.1.1/css/bootstrap-combined.min.css" rel="stylesheet">

Vamos precisar para usar um ícone na coluna.

Abra o arquivo filteradvance2.html e vamos dar continuidade. Para ordenar dados, temos o filter orderBy – no nosso caso vamos dizer que a ordenação vai acontecer com base na coluna que foi clicada. Portanto, vamos fazer isso aqui no head da coluna:

<thead>
<th ng-click="sort('name')">Name
<i ng-class="{'icon-chevron-up':isSortUp('name'),'icon-chevron-down':isSortDown('name')}"></i>
</th>
<th ng-click="sort('lastname')">Lastname
<i ng-class="{'icon-chevron-up':isSortUp('lastname'),'icon-chevron-down':isSortDown('lastname')}"></i>
</th>
<th ng-click="sort('age')">Age
<i ng-class="{'icon-chevron-up':isSortUp('age'),'icon-chevron-down':isSortDown('age')}"></i>
</th>
</thead>

Vamos entender agora. A função sort em ng-click ainda não existe e a criaremos agora. Ela basicamente recebe a propriedade que deve ser ordenada. Na tag <i /> inserimos o ícone e criamos duas funções (uma para ordem crescente e outra pra decrescente, que também vai receber a propriedade para ordenar).

Criando as funções no controller

Agora vamos dar carne ao esqueleto, criando as funções no filterController:

//restante do codigo omitido 

      $scope.sortField = undefined;
      $scope.reverse = false;

	 $scope.isSortUp = function(fieldName){
	 	return $scope.sortField === fieldName && !$scope.reverse;
	 };
	 $scope.isSortDown = function(fieldName){
	 	return $scope.sortField === fieldName && $scope.reverse;
	 };
	 //order data
	 $scope.sort = function(fieldName){
	 	if ($scope.sortField === fieldName) {
	 		$scope.reverse = !$scope.reverse;
	 	}else{
	 		$scope.sortField = fieldName;
	 		$scope.reverse = false;

	 	};
	 }

Vamos testar? Portanto vamos clicar na coluna Name da tabela e ver o acontece:

02 filteradvancedorderasc

Ficou ordenado de forma crescente, agora vamos clicar novamente:

02 filteradvancedorderdesc

Simples, não? Vou ficando por aqui…

Abraços!