Angular Seleção de linha de grade
Com a seleção de linha no Ignite UI for Angular, há uma coluna seletora de linha que precede todas as outras colunas dentro da linha. Quando um usuário clica no seletor de linha, a linha será selecionada ou desmarcada, permitindo que o usuário selecione várias linhas de dados.
Angular Row Selection Example
O exemplo abaixo demonstra os três tipos de comportamento de seleção de linha do Grid. Use os botões abaixo para ativar cada um dos modos de seleção disponíveis. Uma breve descrição será fornecida em cada interação do botão por meio de uma caixa de mensagem de lanchonete. Use o botão de alternância para ocultar ou mostrar a caixa de seleção do seletor de linha.
Para obter elementos recém-selecionados, você pode usar event.newSelection:
public handleRowSelection(event: IRowSelectionEventArgs) {
this.selectedRowsCount = event.newSelection.length;
this.selectedRowIndex = event.newSelection[0];
this.snackbarRowCount.open();
this.snackbar.close();
this.logAnEvent(`=> 'rowSelectionChanging' with value: ` + JSON.stringify(event.newSelection));
}
Setup
Para configurar a seleção de linha no igx-grid
, você só precisa definir a propriedade rowSelection. Essa propriedade aceita a enumeração GridSelectionMode. GridSelectionMode expõe os três modos a seguir: nenhum, único e múltiplo. Abaixo, veremos cada um deles com mais detalhes.
None Selection
Por padrão, a seleção de linha está desabilitada igx-grid
, caso contrário ([rowSelection]="'none'"). Portanto, você não pode selecionar ou desmarcar uma linha por meio da interação com a interface do usuário do Grid, a única maneira de concluir essas ações é usar os métodos de API fornecidos.
Single Selection
A seleção de linha única agora pode ser facilmente configurada, a única coisa que você precisa fazer é definir [rowSelection] = '"single"'
a propriedade. Isso lhe dá a oportunidade de selecionar apenas uma linha dentro de uma grade. Você pode selecionar uma linha clicando em uma célula ou pressionando a tecla de espaço ao focar em uma célula da linha e, claro, pode selecionar uma linha clicando no campo seletor de linha. Quando a linha é selecionada ou desmarcada o evento rowSelectionChanging é emitido.
<!-- selectionExample.component.html -->
<igx-grid [data]="remote | async" [rowSelection]="'single'" [autoGenerate]="true"
(rowSelectionChanging)="handleRowSelection($event)" [allowFiltering]="true">
</igx-grid>
/* selectionExample.component.ts */
public handleRowSelection(args) {
if (args.added.length && args.added[0] === 3) {
args.cancel = true;
}
}
Multiple Selection
Para habilitar a seleção de várias linhas, igx-grid
basta definir a rowSelection
propriedade como multiple
. Isso habilitará um campo seletor de linha em cada linha e no cabeçalho da grade. O seletor de linha permite que os usuários selecionem várias linhas, com a seleção persistindo por meio de operações de rolagem, paginação e dados, como classificação e filtragem. A linha também pode ser selecionada clicando em uma célula ou pressionando a tecla de espaço quando uma célula estiver focada. Se você selecionou uma linha e clicou em outra enquanto mantém pressionada a tecla shift, isso selecionará todo o intervalo de linhas. Neste modo de seleção, quando você clica em uma única linha, as linhas selecionadas anteriormente serão desmarcadas. Se você clicar enquanto segura a tecla ctrl, a linha será alternada e a seleção anterior será preservada.
<!-- selectionExample.component.html -->
<igx-grid [data]="remote | async" [primaryKey]="'ProductID'" [rowSelection]="'multiple'"
(rowSelectionChanging)="handleRowSelection($event)" [allowFiltering]="true" [autoGenerate]="true">
</igx-grid>
<!-- selectionExample.component.ts -->
public handleRowSelection(event: IRowSelectionEventArgs) {
// use event.newSelection to retrieve primary key/row data of latest selected row
this.selectedRowsCount = event.newSelection.length;
this.selectedRowIndex = event.newSelection[0];
}
Notas
Para ter uma seleção de linha e célula adequada, enquanto o Grid tem virtualização remota, um
primaryKey
deve ser fornecido.Quando a Grid tiver virtualização remota, clicar na caixa de seleção do cabeçalho selecionará/desmarcará todos os registros que estão atualmente na grade. Quando novos dados são carregados na Grade sob demanda, as linhas recém-adicionadas não serão selecionadas e isso é uma limitação, portanto, você deve lidar com esse comportamento por conta própria e pode selecionar essas linhas usando os métodos de API fornecidos.
A seleção de linha acionará o
rowSelectionChanging
evento. Este evento fornece informações sobre a nova seleção, a seleção antiga, as linhas que foram adicionadas e removidas da seleção antiga. Além disso, o evento pode ser cancelado, o que permite evitar a seleção.Quando a seleção de linha está ativada, os seletores de linha são exibidos, mas se você não quiser mostrá-los, poderá definir
[hideRowSelectors] = true
.Ao alternar entre os modos de seleção de linha em tempo de execução, isso limpará o estado de seleção de linha anterior.
API usage
Select rows programmatically
O trecho de código abaixo pode ser usado para selecionar uma ou várias linhas simultaneamente (via primaryKey
); Além disso, o segundo parâmetro desse método é uma propriedade booleana por meio da qual você pode escolher se a seleção de linha anterior será desmarcada ou não. A seleção anterior é preservada por padrão.
<!-- selectionExample.component.html -->
<igx-grid ... [primaryKey]="'ID'">
...
</igx-grid>
...
<button (click)="this.grid.selectRows([1,2,5], true)">Select 1,2 and 5</button> // select rows and clear previous selection state
Isso adicionará as linhas que correspondem às entradas de dados com IDs 1, 2 e 5 à seleção de Grade.
Deselect rows
Se você precisar desmarcar linhas programaticamente, poderá usar o deselectRows(rowIds: [])
método.
<!-- selectionExample.component.html -->
<igx-grid ... [primaryKey]="'ID'">
...
</igx-grid>
...
<button (click)="this.grid.deselectRows([1,2,5])">Deselect 1,2 and 5</button>
Row selection event
Quando há alguma alteração na seleção, o evento de seleção rowSelectionChanging
de linha é emitido. rowSelectionChanging
expõe os seguintes argumentos:
oldSelection
- matriz de dados da linha que contém o estado anterior da seleção da linha.newSelection
- matriz de dados de linha que correspondem ao novo estado da seleção de linha.added
- matriz de dados da linha que estão atualmente adicionados à seleção.removed
- matriz de dados de linha que são removidos atualmente de acordo com o estado de seleção antigo.event
- o evento original que acionou a alteração na seleção de linha.cancel
- permite impedir a alteração da seleção de linha.
Evento de seleção de linha em cenários de dados remotos
Em cenários de dados remotos, quando a grade tiver um primaryKey
argumento set,event rowSelectionChanging.oldSelection
não conterá o objeto de dados de linha completa para as linhas que estão atualmente fora da exibição de dados. Nesse caso, rowSelectionChanging.oldSelection
o objeto conterá apenas uma propriedade, que é o primaryKey
campo. Para o restante das linhas, atualmente na exibição de dados, rowSelectionChanging.oldSelection
conterá os dados da linha inteira.
<!-- selectionExample.component.html -->
<igx-grid (rowSelectionChanging)="handleRowSelectionChange($event)">
...
</igx-grid>
/* selectionExample.component.ts */
public handleRowSelectionChange(args) {
args.cancel = true; // this will cancel the row selection
}
Select all rows
Outro método de API útil que igx-grid
fornece é selectAll(onlyFilteredData)
. Por padrão, esse método selecionará todas as linhas de dados, mas se a filtragem for aplicada, ele selecionará apenas as linhas que correspondem aos critérios de filtro. Mas se você chamar o método com o parâmetro false, selectAll(false)
sempre selecionará todos os dados na grade, mesmo que a filtragem seja aplicada.
Note
Lembre-se de que selectAll()
não selecionará as linhas que são excluídas.
Deselect all rows
igx-grid
provides deselectAll(onlyFilteredData)
método, que, por padrão, desmarcará todas as linhas de dados, mas se a filtragem for aplicada, desmarcará apenas as linhas que correspondem aos critérios de filtro. Mas se você chamar o método com o parâmetro false, sempre limpará todo o estado de seleção de linha, deselectAll(false)
mesmo que a filtragem seja aplicada.
How to get selected rows
Se você precisar ver quais linhas estão selecionadas no momento, poderá obter suas IDs de linha com o selectedRows
getter.
public getSelectedRows() {
const currentSelection = this.grid.selectedRows; // return array of row IDs
}
Além disso, atribuir IDs de linha a selectedRows
permitirá que você altere o estado de seleção da grade.
public mySelectedRows = [1, 2, 3]; // an array of row IDs
<igx-grid primaryKey="ProductID" rowSelection="multiple" [autoGenerate]="false" [mySelectedRows]="selectedRows" [data]="data">
<igx-column [field]="'ProductID'"></igx-column>
<igx-column [field]="'ProductName'"></igx-column>
<igx-column [field]="'UnitsInStock'"></igx-column>
</igx-grid>
Row selector templates
Você pode modelar seletores de cabeçalho e linha na Grade e também acessar seus contextos que fornecem funcionalidade útil para diferentes cenários.
Por padrão, o Grid lida com todas as interações de seleção de linha no contêiner pai do seletor de linha ou na própria linha, deixando apenas a visualização de estado para o modelo. A substituição da funcionalidade básica geralmente deve ser feita usando o rowSelectionChanging
evento. Caso você implemente um modelo personalizado com um click
manipulador que substitui a funcionalidade base, você deve interromper a propagação do evento para preservar o estado de linha correto.
Modelo de linha
Para criar um modelo de seletor de linha personalizado, dentro do igx-grid
, declare uma <ng-template>
diretiva with igxRowSelector
. No modelo, você pode acessar a variável de contexto fornecida implicitamente, com propriedades que fornecem informações sobre o estado da linha.
A propriedade selected
mostra se a linha atual está selecionada ou não, enquanto a propriedade index
pode ser usada para acessar o índice da linha.
<ng-template igxRowSelector let-rowContext>
{{ rowContext.index }}
<igx-checkbox
[checked]="rowContext.selected"
[readonly]="true"
></igx-checkbox>
</ng-template>
A rowID
propriedade pode ser usada para obter uma referência de uma igx-grid
linha. Isso é útil quando você implementa um click
manipulador no elemento seletor de linha.
<ng-template igxRowSelector let-rowContext>
<igx-checkbox (click)="onSelectorClick($event, rowContext.key)"></igx-checkbox>
</ng-template>
No exemplo acima, estamos usando um igx-checkbox
e nos ligamos rowContext.selected
à sua checked
propriedade. Veja isso em ação em nosso Row Numbering Demo
.
Header template
Para criar um modelo de seletor de cabeçalho personalizado, dentro da Grade, declare uma <ng-template>
diretiva with igxHeadSelector
. No modelo, você pode acessar a variável de contexto fornecida implicitamente, com propriedades que fornecem informações sobre o estado do cabeçalho.
A selectedCount
propriedade mostra quantas linhas estão selecionadas no momento, enquanto totalCount
mostra quantas linhas existem na Grade no total.
<ng-template igxHeadSelector let-headContext>
{{ headContext.selectedCount }} / {{ headContext.totalCount }}
</ng-template>
As selectedCount
propriedades and totalCount
podem ser usadas para determinar se o seletor de cabeça deve ser verificado ou indeterminado (parcialmente selecionado).
<igx-grid [data]="gridData" primaryKey="ProductID" rowSelection="multiple">
<!-- ... -->
<ng-template igxHeadSelector let-headContext>
<igx-checkbox
[checked]=" headContext.selectedCount > 0 && headContext.selectedCount === headContext.totalCount"
[indeterminate]="headContext.selectedCount > 0 && headContext.selectedCount !== headContext.totalCount">
</igx-checkbox>
</ng-template>
</igx-grid>
Row Numbering Demo
Esta demonstração mostra o uso de seletores de cabeçalho e linha personalizados. O último usa rowContext.index
para exibir números de linha e um igx-checkbox
limite a rowContext.selected
.
Excel Style Row Selectors Demo
Esta demonstração usa modelos personalizados para se assemelhar aos seletores de cabeçalho e linha do Excel.
Conditional Selection Demo
Esta demonstração impede que algumas linhas sejam selecionadas usando o evento e um modelo personalizado com caixa de seleção desativada rowSelectionChanging
para linhas não selecionáveis.
API References
Additional Resources
- Visão geral da grade
- Escolha
- Seleção de células
- Paginação
- Filtragem
- Classificação
- Resumos
- Movimentação de Colunas
- Fixação de coluna
- Redimensionamento de colunas
- Virtualização e desempenho