Eu uso DataTables para paginar e ordenar uma tabela contendo dados do usuário.
O conjunto de dados completo vem de um banco de dados MySQL por meio de um aplicativo .NET.
A primeira coluna da tabela tem que conter a contagem de linhas (atual) de uma maneira que tornaria a contagem "imune" à reorganização das linhas (classificação, em outras palavras). É por isso que usei uma contagem de linhas baseada em CSS, como visível abaixo:
new DataTable('#employees', {
info: false,
paging: true,
"aLengthMenu": [5, 10, 20],
// "dom": 'rtip',
});
.dt-column-order:before {
margin-bottom: 1px;
}
th {
outline: none !important;
}
.dt-paging {
margin-top: 15px !important;
}
.pagination {
justify-content: flex-end;
}
/* CSS row count */
table {
counter-reset: row-num;
}
table tbody tr {
counter-increment: row-num;
}
table tbody tr td:first-child::before {
content: counter(row-num) "";
}
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js"></script>
<script src="https://cdn.datatables.net/2.1.8/js/dataTables.min.js"></script>
<script src="https://cdn.datatables.net/2.1.8/js/dataTables.bootstrap5.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.datatables.net/2.1.8/css/dataTables.bootstrap5.min.css" rel="stylesheet" />
<div class="container-fluid my-2">
<h2>Data Tables</h2>
<table id="employees" class="table table-bordered table-striped mx-1">
<thead>
<tr>
<th data-dt-order="disable">No</th>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Age</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>Tiger Nixon</td>
<td>System Architect</td>
<td>Edinburgh</td>
<td>61</td>
<td>2011-04-25</td>
<td>$320,800</td>
</tr>
<tr>
<td></td>
<td>Garrett Winters</td>
<td>Accountant</td>
<td>Tokyo</td>
<td>63</td>
<td>2011-07-25</td>
<td>$170,750</td>
</tr>
<tr>
<td></td>
<td>Ashton Cox</td>
<td>Junior Technical Author</td>
<td>San Francisco</td>
<td>66</td>
<td>2009-01-12</td>
<td>$86,000</td>
</tr>
<tr>
<td></td>
<td>Cedric Kelly</td>
<td>Senior Javascript Developer</td>
<td>Edinburgh</td>
<td>22</td>
<td>2012-03-29</td>
<td>$433,060</td>
</tr>
<tr>
<td></td>
<td>Ștefan Popa</td>
<td>Accountant</td>
<td>Tokyo</td>
<td>33</td>
<td>2008-11-28</td>
<td>$162,700</td>
</tr>
<tr>
<td></td>
<td>Brielle Williamson</td>
<td>Integration Specialist</td>
<td>New York</td>
<td>61</td>
<td>2012-12-02</td>
<td>$372,000</td>
</tr>
<tr>
<td></td>
<td>Herrod Chandler</td>
<td>Sales Assistant</td>
<td>San Francisco</td>
<td>59</td>
<td>2012-08-06</td>
<td>$137,500</td>
</tr>
<tr>
<td></td>
<td>Rhona Davidson</td>
<td>Integration Specialist</td>
<td>Tokyo</td>
<td>55</td>
<td>2010-10-14</td>
<td>$327,900</td>
</tr>
<tr>
<td></td>
<td>Colleen Hurst</td>
<td>Javascript Developer</td>
<td>San Francisco</td>
<td>39</td>
<td>2009-09-15</td>
<td>$205,500</td>
</tr>
<tr>
<td></td>
<td>Sonya Frost</td>
<td>Software Engineer</td>
<td>Edinburgh</td>
<td>23</td>
<td>2008-12-13</td>
<td>$103,600</td>
</tr>
<tr>
<td></td>
<td>Jena Gaines</td>
<td>Office Manager</td>
<td>London</td>
<td>30</td>
<td>2008-12-19</td>
<td>$90,560</td>
</tr>
<tr>
<td></td>
<td>Quinn Flynn</td>
<td>Support Lead</td>
<td>Edinburgh</td>
<td>22</td>
<td>2013-03-03</td>
<td>$342,000</td>
</tr>
</tbody>
</table>
</div>
Porém, há um problema com essa solução: sempre que o conjunto de resultados for grande o suficiente para que haja paginação, a contagem de linhas começa em 1 para cada página.
Então, eu realmente preciso de uma contagem de linhas baseada em JavaScript, que não zeraria a contagem para cada página. Não encontrei uma maneira de fazer isso bult em DataTables.
Questões
- Existe uma solução integrada do DataTables para isso?
- Caso contrário, qual seria uma solução viável para o problema?
Você pode ouvir o
draw
evento e atualizar seu contador CSS com opage.info().start
número:No exemplo, um ouvinte de evento foi adicionado
document
porque o<table>
e talvez elementos mais acima na hierarquia estavam sendo destruídos e criados. De qualquer forma, foi complicado tentar obter a página correta, mas obtive um número de índice ao encontrar o<button>
atualmente residente dentro de<li class="active">
. Agora que o índice certo estava correto, usei uma matriz com os 3 números que eram os números da linha inicial para cada página. Finalmente, obtive uma variável CSS--start
para alterar o valor decounter-set
que também é o segundo valor decounter-reset
atribuído a<table>
. Então, toda vez que a página é alterada, esse valor muda de 0 para 5 e para 10." Existe uma solução integrada do DataTables para isso? "
Sim, supondo que eu tenha entendido o que você quis dizer com "contagem de linhas" na sua pergunta.
Imagino que você não queira dizer "uma contagem do número total de linhas"... Mas sim o número da linha , começando em "1" para sua linha "Tiger Nixon", e "2" para a próxima linha, e assim por diante... E esse número precisa ser independente de classificação, filtragem e paginação: a linha "Tiger Nixon" deve ser sempre a linha número "1" na primeira coluna da tabela, mesmo quando não for exibida como a primeira linha vista por um usuário, devido à classificação/filtragem/paginação.
Cada linha recebe um número de índice, com base na ordem em que os dados são carregados pela primeira vez na DataTable quando a DataTable é inicializada. Esse número de índice atribuído nunca muda, a menos que você exclua dados da DataTable ou reinicialize a DataTable.
Este número de índice é acessado por meio da API DataTables usando
row().index()
.Mais útil, no seu caso, o índice de linha pode ser acessado por uma função de dados de coluna:
function data( row, type, set, meta )
, que está documentada nesta página .Veja a definição para o
meta
parâmetro nessa função. Ela lhe dá acesso a:Então, sua demonstração pode ser usada
meta
da seguinte forma:Isso tem a vantagem de que você está operando diretamente nos dados do DataTables - e não nos dados que são exibidos no DOM para uma determinada página de dados visíveis.
Por que isso é
if (meta)
necessário? Por causa do suporte do DataTables para dados ortogonais , que permite que você armazene valores diferentes para uma célula, para propósitos diferentes (o que você vê em uma célula pode ser diferente de como você quer classificar ou filtrar esses dados).Há um tipo ortogonal extra (
set
- usado por plugins) que não contém nenhummeta
dado - então seu código geraria um erro (meta
não existe) sem essa verificação.Opção 2
Alternativamente...
Para números de linhas estáticos (semelhantes ao Excel), você precisa reescrever os dados de exibição toda vez que o usuário executar uma ação de classificação, filtro ou paginação.
Isso envolve algum JavaScript, usando a API DataTables.
Primeiro, defina uma
table
variável e também adicione umainitComplete
função para manipular a primeira vez que a tabela é exibida:Adicione um
on draw
evento para manipular todas as alterações subsequentes feitas pelo usuário (classificar/filtrar/paginar):O gravador de números de linha é simples: ele apenas itera sobre os dados visíveis (DOM) na tabela exibida:
Mas, novamente, talvez eu não tenha entendido o que você quer dizer com "contagem de linhas"...
Opção 3
Esta última opção é para futuros visitantes do site, que podem estar interessados em diferentes abordagens.
Esta é uma variação da opção 2, mas em vez de iniciar cada nova página de resultados em "1", isso leva em consideração o número da página exibida no momento.
Ele é usado
page.info().start
para obter:Como as linhas são indexadas em zero, adicionamos 1 a
start
, no código abaixo.Uma demonstração executável da opção 3: