Angular Tree Grid Remote Data Operations
The Ignite UI for Angular Tree Grid supports remote data operations such as remote virtualization, remote sorting, remote filtering and others. This allows the developer to perform these tasks on a server, retrieve the data that is produced and display it in the Tree Grid.
Angular Tree Grid Remote Data Operations Overview Example
By default, the Tree Grid uses its own logic for performing data operations. You can perform these tasks remotely and feed the resulting data to the Tree Grid by taking advantage of certain inputs and events, which are exposed by the Tree Grid.
Remote Filtering
To provide remote filtering, you need to subscribe to the filteringExpressionsTreeChange
output so that you make the appropriate request based on the arguments received. Let's use a flat collection as a data source for our Tree Grid by providing a primaryKey
and a foreignKey
.
Também aproveitaremos a função rxjs debounceTime
, que emite um valor da fonte Observable somente após um determinado intervalo de tempo ter passado sem outra emissão de origem. Dessa forma, a operação remota será acionada somente quando o tempo especificado tiver passado sem que o usuário a interrompa.
const DEBOUNCE_TIME = 300;
...
public ngAfterViewInit() {
...
this.treeGrid.filteringExpressionsTreeChange.pipe(
debounceTime(DEBOUNCE_TIME),
takeUntil(this.destroy$)
).subscribe(() => {
this.processData();
});
}
When remote filtering is provided, usually we do not need the built-in filtering of the Tree Grid. We can disable it by setting the filterStrategy
input of the Tree Grid to the NoopFilteringStrategy
instance.
<!-- tree-grid-remote-filtering-sample.html -->
<igx-tree-grid #treeGrid [data]="remoteData | async" primaryKey="ID" foreignKey="ParentID"
[autoGenerate]="false"
[filterStrategy]="noopFilterStrategy"
[allowFiltering]="true">
<igx-column [field]="'Name'" dataType="string"></igx-column>
<igx-column [field]="'Title'" dataType="string"></igx-column>
<igx-column [field]="'Age'" dataType="number"></igx-column>
</igx-tree-grid>
// tree-grid-remote-filtering-sample.ts
public noopFilterStrategy = NoopFilteringStrategy.instance();
public processData() {
this.treeGrid.isLoading = true;
const filteringExpr = this.treeGrid.filteringExpressionsTree;
this._remoteService.getData(filteringExpr, () => {
this.treeGrid.isLoading = false;
});
}
The remote filtering will have to be performed over the flat collection directly. We will also have to include all the parents for any record that matches the filtering condition regardless of whether or not the parents match the filtering (we do this to keep the hierarchy intact). The result can be seen below:
Note
Quando dados remotos são solicitados, a operação de filtragem diferencia maiúsculas de minúsculas.
Remote Filtering Demo
Você pode ver o resultado do código acima no início deste artigo na seção Demonstração.
Unique Column Values Strategy
The list items inside the Excel Style Filtering dialog represent the unique values for the respective column. The Tree Grid generates these values based on its data source by default. In case of remote filtering, the grid data does not contain all the data from the server. In order to provide the unique values manually and load them on demand, we can take advantage of the Tree Grid's uniqueColumnValuesStrategy
input. This input is actually a method that provides three arguments:
- column: a respectiva instância da coluna.
- filteringExpressionsTree: a árvore de expressões de filtragem, que é reduzida com base na respectiva coluna.
- done- Retorno de chamada que deve ser chamado com os valores de coluna recém-gerados quando eles são recuperados do servidor.
O desenvolvedor pode gerar manualmente os valores de coluna exclusivos necessários com base nas informações, fornecidas pela coluna e pelos argumentos filteringExpressionsTree e, em seguida, invocar o retorno de chamada done.
Note
Quando a uniqueColumnValuesStrategy
entrada é fornecida, o processo de geração de valores exclusivos padrão na filtragem de estilo do Excel não será usado.
<igx-tree-grid #treeGrid [data]="data" [filterMode]="'excelStyleFilter'" [uniqueColumnValuesStrategy]="columnValuesStrategy">
...
</igx-tree-grid>
public columnValuesStrategy = (column: ColumnType,
columnExprTree: IFilteringExpressionsTree,
done: (uniqueValues: any[]) => void) => {
// Get specific column data.
this.remoteValuesService.getColumnData(column, columnExprTree, uniqueValues => done(uniqueValues));
}
Unique Column Values Strategy Demo
Para fornecer um modelo de carregamento personalizado para a filtragem de estilo do Excel, podemos usar a igxExcelStyleLoading
diretiva:
<igx-tree-grid [data]="data" [filterMode]="'excelStyleFilter'" [uniqueColumnValuesStrategy]="columnValuesStrategy">
...
<ng-template igxExcelStyleLoading>
Loading ...
</ng-template>
</igx-tree-grid>
Remote Paging
In this sample we will demonstrate how to display a certain number of root records per page no matter how many child records they have. In order to cancel the built-in Tree Grid paging algorithm, which displays a certain number of records no matter their level (root or child), we have to set the perPage
property to Number.MAX_SAFE_INTEGER
.
<igx-tree-grid #treeGrid ...>
<igx-paginator [perPage]="maxPerPage">
</igx-paginator>
...
public maxPerPage = Number.MAX_SAFE_INTEGER;
Agora podemos escolher entre configurar nosso próprio modelo de paginação personalizado ou usar o padrão que o igx-paginator
fornece. Primeiro, vamos dar uma olhada no que é necessário para configurar a paginação remota usando o modelo de paginação padrão.
Remote paging with default template
Se você quiser usar o modelo de paginação padrão, precisará definir a propriedade do totalRecords
paginador, somente então a grade poderá calcular o número total da página com base no total de registros remotos. Ao executar uma paginação remota, o paginador passará para a grade apenas os dados da página atual, portanto, a grade não tentará paginar a fonte de dados fornecida. É por isso que devemos definir a propriedade de pagingMode
Grid como GridPagingMode.remote. Também é necessário assinar pagingDone
ou perPageChange
eventos para buscar os dados do seu serviço remoto, depende do caso de uso qual evento será usado.
<igx-tree-grid #treeGrid [data]="data | async" childDataKey="Content" [pagingMode]="mode">
<igx-column field="Name"></igx-column>
...
<igx-paginator [(page)]="page" [(perPage)]="perPage" [totalRecords]="totalCount"
(pagingDone)="paginate($event.current)">
</igx-paginator>
</igx-tree-grid>
public totalCount = 0;
public data: Observable<any[]>;
public mode = GridPagingMode.remote;
public isLoading = true;
@ViewChild('grid1', { static: true }) public grid1: IgxGridComponent;
private _dataLengthSubscriber;
public set perPage(val: number) {
this._perPage = val;
this.paginate(0);
}
public ngOnInit() {
this.data = this.remoteService.remoteData.asObservable();
this._dataLengthSubscriber = this.remoteService.getDataLength().subscribe((data: any) => {
this.totalCount = data;
this.grid1.isLoading = false;
});
}
public ngAfterViewInit() {
const skip = this.page * this.perPage;
this.remoteService.getData(skip, this.perPage);
}
public paginate(page: number) {
this.page = page;
const skip = this.page * this.perPage;
const top = this.perPage;
this.remoteService.getData(skip, top);
}
Remote Paging with custom igx-paginator-content
Quando definimos um conteúdo de paginador personalizado, precisamos definir o conteúdo de forma a obter os dados apenas para a página solicitada e passar os parâmetros skip e top corretos para o serviço remoto de acordo com a página e os itens selecionados perPage
. Vamos usar o <igx-paginator>
para facilitar nossa configuração de exemplo, junto com o e IgxPageNavigationComponent
que foram introduzidos IgxPageSizeSelectorComponent
-igx-page-size
adicionará o menu suspenso e o rótulo por página e igx-page-nav
adicionará os botões e rótulos de ação de navegação.
<igx-paginator #paginator
[totalRecords]="totalCount"
[(perPage)]="perPage"
[selectOptions]="selectOptions"
(pageChange)="paginate($event)">
<igx-paginator-content>
<igx-page-size></igx-page-size>
[This is my custom content]
<igx-page-nav></igx-page-nav>
</igx-paginator-content>
</igx-paginator>
public paginate(page: number) {
this.page = page;
const skip = this.page * this.perPage;
const top = this.perPage;
this.remoteService.getData(skip, top);
}
Note
Para que a paginação remota seja configurada corretamente, um GridPagingMode.Remote
deve ser definido:
<igx-tree-grid #treeGrid [data]="data | async" childDataKey="Content"
expansionDepth="0" width="100%" height="540px" [pagingMode]="mode"></igx-tree-grid>
...
public mode = GridPagingMode.Remote;
A última etapa será declarar o conteúdo do paginador com base em seus requisitos.
<igx-paginator-content>
<igx-page-size></igx-page-size>
[This is my custom content]
<igx-page-nav></igx-page-nav>
</igx-paginator-content>
Após todas as alterações acima, o seguinte resultado será alcançado.
Known Issues and Limitations
- Quando a grade não tiver nenhuma
primaryKey
configuração e os cenários de dados remotos estiverem habilitados (ao paginar, classificar, filtrar, rolar solicitações de gatilho para um servidor remoto para recuperar os dados a serem exibidos na grade), uma linha perderá o seguinte estado após a conclusão de uma solicitação de dados:- Seleção de linha
- Expandir/recolher linha
- Edição de linha
- Fixação de linha
- Em cenários de dados remotos, quando a grade tiver um
primaryKey
argumento set,eventrowSelectionChanging.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 é oprimaryKey
campo. Para o restante das linhas, atualmente na exibição de dados,rowSelectionChanging.oldSelection
conterá os dados da linha inteira.
API References
Additional Resources
- Paginação
- Visão geral da grade de árvore
- Virtualização e desempenho
- Filtragem
- Classificação
- Resumos
- Movimentação de Colunas
- Fixação de coluna
- Redimensionamento de colunas
- Escolha