Angular 7 -  Realizando a paginação de dados


  Hoje veremos como realizar a paginação de dados no Angular 6 (Angular 7).

A paginação permite que as informações sejam divididas entre páginas; o objetivo é evitar apresentar em uma única página uma grande quantidade de dados, o que pode ser difícil de tratar e também pode impactar o desempenho do seu projeto.

Neste primeiro contato vamos usar dados em memória para mostrar como realizar a paginação de dados.

Criando um aplicação Angular

Vamos usar o Angular CLI para criar nossa aplicação Angular que vai paginar dados.

Nota: Para verificar a versão do seu Angular CLI digite: ng --version  

O comando : npm install -g @angular/cli   instala o Angular CLI.

Vamos criar a aplicação angular em uma pasta reservada para projetos angular: c:\_angular_2019

Entre na pasta do projeto e a seguir abra uma prompt de comandos e digite o comando : ng new paginacao1

Será criado um projeto Angular na pasta paginacao1. Vamos entrar na pasta digitando:  cd paginacao1

A seguir digite o comando : code .  

Isso vai abrir o projeto no Visual Studio Code:

O arquivo package.json é onde ficam as dependências do projeto

Na pasta src temos a pasta app onde estão os componentes da aplicação

O arquivo tsconfig.json é o arquivo de configuração TypeScript;

Dentro da pasta src temos a pasta app onde vamos criar os componentes da nossa aplicação.

Na pasta app temos o arquivo app.component.ts que contém a classe Component chamada de AppComponent onde definimos o que vamos exibir ao usuário.

Um componente é um recurso utilizado para criar uma classe responsável por controlar e manter o estado de uma view.

O arquivo app.component.html é onde vamos exibir a nossa aplicação.

O arquivo app.module.ts contém a classe AppModule é responsável por expor para a aplicação algum código específico, que pode ser uma classe, uma função, ou mesmo uma constante.

Se você estiver usando o Angular 7 talvez tenha que atualizar o pacote: @angular-devkit/build-angular

Se o pacote usado estiver em uma versão anterior a : 0.13.0, então desinstale a versão usada no projeto e instale a versão 0.13.0 :

npm uninstall @angular-devkit/build-angular
npm install @angular-devkit/build-angular@0.13.0

Usando o componente ngx-pagination

Para realizar a paginação no Angular vamos usar o componente ngx-pagination cuja documentação pode ser consultada neste link: http://michaelbromley.github.io/ngx-pagination/#/

Para instalar o componente no projeto digite o seguinte comando a partir da pasta do projeto:

npm install ngx-pagination --save

A seguir abra o arquivo app.module.ts e importe o módulo NgxPaginationModule :

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { NgxPaginationModule } from 'ngx-pagination';
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    NgxPaginationModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Definindo os dados usados para paginação

Abra o arquivo app.component.ts e inclua o código a seguir onde criamos um array de dados que serão usados para demonstração:

import { Component } from '@angular/core';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Paginação Angular 7';
  public dadosAlunos=[];
  pag : Number = 1 ;
  contador : Number = 5;
  constructor() {
    console.log('Aplicação iniciada, Carregando dados...');
    this.dadosAlunos = [
      { 'id': 1, 'nome': 'Clare Cornau', 'fone': '(815) 6180492', 'email': 'ccornau0@bigcartel.com', 'sexo': 'Feminino', 'pais': 'Somalia' },
      { 'id': 2, 'nome': 'Edouard Elsmore', 'fone': '(507) 3119958', 'email': 'eelsmore1@goo.gl', 'sexo': 'Masculino', 'pais': 'United States' },
      { 'id': 3, 'nome': 'Aeriel Elldred', 'fone': '(478) 7181722', 'email': 'aelldred2@archive.org', 'sexo': 'Feminino', 'pais': 'Russia' },
      { 'id': 4, 'nome': 'Yan Chi Mung', 'fone': '(698) 4411762', 'email': 'ameachem3@columbia.edu', 'sexo': 'Feminino', 'pais': 'China' },
      { 'id': 5, 'nome': 'Jeremiah Hadwen', 'fone': '(345) 6582965', 'email': 'jhadwen4@contakte.ru', 'sexo': 'Masculino', 'pais': 'Mongolia' },
      { 'id': 6, 'nome': 'Romilada Andrade', 'fone': '(659) 9557733', 'email': 'romildandr@times.com', 'sexo': 'Masculino', 'pais': 'Belgica' },
      { 'id': 7, 'nome': 'Ramirez Gonzales', 'fone': '(864) 2101861', 'email': 'ramgonz@yellowbook.com', 'sexo': 'Masculino', 'pais': 'Peru' },
      { 'id': 8, 'nome': 'Jayme Crotty', 'fone': '(165) 5814372', 'email': 'jcrotty7@opensource.org', 'sexo': 'Masculino', 'pais': 'Niger' },
      { 'id': 9, 'nome': 'Margo Braker', 'fone': '(428) 2282928', 'email': 'mbraker8@yahoo.co.jp', 'sexo': 'Feminino', 'pais': 'Argentina' },
      { 'id': 10, 'nome': 'Bernardo Guzman', 'fone': '(673) 5170425', 'email': 'bernardguz@google.com', 'sexo': 'Feminino', 'pais': 'Uruguai' },
      { 'id': 11, 'nome': 'Darelle Rowlands', 'fone': '(978) 8885907', 'email': 'drowland@slate.com', 'sexo': 'Feminino', 'pais': 'Indonesia' },
      { 'id': 12, 'nome': 'Neile Keets', 'fone': '(956) 9360112', 'email': 'nkeetsb@canalblog.com', 'sexo': 'Feminino', 'pais': 'Finlandia' },
      { 'id': 13, 'nome': 'Sonia Buarque', 'fone': '(055) 7150720', 'email': 'soniabuarque@so-net.net', 'sexo': 'Feminino', 'pais': 'Brasil' },
      { 'id': 14, 'nome': 'Ana Maria Rocha', 'fone': '(055) 4076124', 'email': 'anamaria@com.com', 'sexo': 'Masculino', 'pais': 'Brasil' },
      { 'id': 15, 'nome': 'Carola Balasin', 'fone': '(262) 7945277', 'email': 'cbalasine@blogger.com', 'sexo': 'Feminino', 'pais': 'Bolivia' },
      { 'id': 16, 'nome': 'Ming Liu Siang', 'fone': '(501) 3984600', 'email': 'cbarrickf@t-online.de', 'sexo': 'Feminino', 'pais': 'China' },
      { 'id': 17, 'nome': 'Inglis Treweela', 'fone': '(718) 4157883', 'email': 'itreweelag@tripod.com', 'sexo': 'Masculino', 'pais': 'Finlandia' },
      { 'id': 18, 'nome': 'Manoel Soares', 'fone': '(213) 5730967', 'email': 'manusoares@yahoo.com', 'sexo': 'Masculino', 'pais': 'Portugal' },
      { 'id': 19, 'nome': 'Hestia Palffrey', 'fone': '(349) 6453938', 'email': 'hpalffreyi@nba.com', 'sexo': 'Feminino', 'pais': 'Madagascar' },
      { 'id': 20, 'nome': 'Papoulous Mordon', 'fone': '(474) 3068249', 'email': 'gmordonj@uiuc.edu', 'sexo': 'Feminino', 'pais': 'Grécia' }
    ];
  }
}

Vamos definir a interface com o usuário no arquivo app.component.html com o código abaixo:

<div class="container">
  <h2 class="text-secondary text-center">{{ title }}!</h2>
  <hr /> 
  <div>
    <h4 class="text-info">Alunos</h4>
    <div> </div>
    <table class="table table-bordered">
      <thead>
        <tr>
          <th>Id</th>
          <th>Nome</th>
          <th>Telefone.</th>
          <th>Email</th>
          <th>Sexo</th>
          <th>País</th>
        </tr>
      </thead>
      <tbody>
        <tr *ngFor="let a of dadosAlunos | paginate: { itemsPerPage: contador, currentPage: pag }">
          <td>{{a.id}}</td>
          <td>{{a.nome}}</td>
          <td>{{a.fone}}</td>
          <td>{{a.email}}</td>
          <td>{{a.sexo}}</td>
          <td>{{a.pais}}</td>
        </tr>
      </tbody>
    </table>
  </div> 
  <!--inclindo o controle de paginação.-->
  <div class="text-right">
    <pagination-controls (pageChange)="p = $event"></pagination-controls>
  </div>
</div>

Para dar uma aparência visual mais elegante à nossa interface vamos incluir uma referência CDN ao Bootstrap no arquivo Index.html:   

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Paginacao1</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" 
  integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" 
  crossorigin="anonymous">
</head>
<body>
  <app-root>Carregando...</app-root>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" 
  crossorigin="anonymous"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" 
  integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
</body>
</html>

Agora no arquivo app.component.css inclua a definição do estilo:

th, td {
    text-align: left;
}

Agora é só alegria...

Na pasta do projeto , no prompt de comandos digite : ng serve -o

A seguir veremos no navegador o seguinte resultado:

Podemos usar as Labels - Previous e Next - em português definindo os valores para previousLabel e nextLabel conforme mostra o código a seguir:

<div class="text-right">
<pagination-controls (pageChange)="paginaAtual = $event" previousLabel="Anterior" nextLabel="Próximo"></pagination-controls>
</div>

Pegue o projeto angular aqui :  paginacao1.zip

"Dando graças ao Pai que nos fez idôneos para participar da herança dos santos na luz;
O qual nos tirou da potestade das trevas, e nos transportou para o reino do Filho do seu amor;
Em quem temos a redenção pelo seu sangue, a saber, a remissão dos pecados;
O qual é imagem do Deus invisível, o primogênito de toda a criação;"
Colossenses 1:12-15

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti