Web Components Operações de Dados Remotos de Grade Hierárquica
Por padrão, o usa IgcHierarchicalGridComponent
sua própria lógica para executar operações de dados.
Você pode executar essas tarefas remotamente e alimentar os dados resultantes para o IgcHierarchicalGridComponent
aproveitando certas entradas e eventos, que são expostos pelo IgcHierarchicalGridComponent
.
Remote Paging
export class RemotePagingService {
public static BASE_URL = 'https://data-northwind.indigo.design/';
public static CUSTOMERS_URL = `${RemotePagingService.BASE_URL}Customers/GetCustomersWithPage`;
constructor() {}
public static getDataWithPaging(pageIndex?: number, pageSize?: number) {
return fetch(RemotePagingService.buildUrl(RemotePagingService.CUSTOMERS_URL, pageIndex, pageSize))
.then((result) => result.json())
.catch((error) => console.error(error.message));
}
public static getHierarchyDataById(parentEntityName: string, parentId: string, childEntityName: string) {
return fetch(`${RemotePagingService.BASE_URL}${parentEntityName}/${parentId}/${childEntityName}`)
.then((result) => result.json());
}
private static buildUrl(baseUrl: string, pageIndex?: number, pageSize?: number) {
let qS = "";
if (baseUrl) {
qS += `${baseUrl}`;
}
// Add pageIndex and size to the query string if they are defined
if (pageIndex !== undefined) {
qS += `?pageIndex=${pageIndex}`;
if (pageSize !== undefined) {
qS += `&size=${pageSize}`;
}
} else if (pageSize !== undefined) {
qS += `?perPage=${pageSize}`;
}
return `${qS}`;
}
}
Após declarar o serviço, precisamos criar um componente, que será responsável pela construção e assinatura de IgcHierarchicalGridComponent
dados.
Primeiro, precisamos vincular aos eventos relevantes para que, quando mudarmos de página e a quantidade de registros mostrados por página, o serviço remoto busque a quantidade correta de dados
constructor() {
this.hierarchicalGrid = document.getElementById("hGrid") as IgcHierarchicalGridComponent;
this.pager = document.getElementById('paginator') as IgcPaginatorComponent;
const ordersRowIsland = document.getElementById("ordersRowIsland") as IgcRowIslandComponent;
const orderDetailsRowIsland = document.getElementById("orderDetailsRowIsland") as IgcRowIslandComponent;
ordersRowIsland.paginatorTemplate = this.webHierarchicalGridPaginatorTemplate;
orderDetailsRowIsland.paginatorTemplate = this.webHierarchicalGridPaginatorTemplate;
this._bind = () => {
window.addEventListener("load", () => {
this.pager.perPage = this._perPage;
this.loadCustomersData(this.page,this.perPage);
});
this.pager.addEventListener("perPageChange", ((args: CustomEvent<any>) => {
this.perPage = args.detail;
this.loadCustomersData(this.page, this.perPage);
}) as EventListener);
this.pager.addEventListener("pageChange", ((args: CustomEvent<any>) => {
this.page = args.detail;
this.loadCustomersData(this.page, this.perPage);
}) as EventListener);
ordersRowIsland.addEventListener("gridCreated", (event: any) => {
this.gridCreated(event, "Customers");
});
orderDetailsRowIsland.addEventListener("gridCreated", (event: any) => {
this.gridCreated(event, "Orders");
});
}
this._bind();
}
Também precisamos definir o método para carregar dados e atualizar a interface do usuário de acordo:
private updateUI(): void {
if (this.hierarchicalGrid && this.data) { // Check if grid and data are available
this.hierarchicalGrid.data = this.data;
}
}
private loadCustomersData(pageIndex?: number, pageSize?: number): void {
this.hierarchicalGrid.isLoading = true;
RemotePagingService.getDataWithPaging(pageIndex,pageSize)
.then((response: CustomersWithPageResponseModel) => {
this.totalRecordsCount = response.totalRecordsCount;
this.pager.perPage = pageSize;
this.pager.totalRecords = this.totalRecordsCount;
this.page = response.pageNumber;
this.data = response.items;
this.hierarchicalGrid.isLoading = false;
this.updateUI(); // Update the UI after receiving data
})
.catch((error) => {
console.error(error.message);
this.hierarchicalGrid.data = [];
this.hierarchicalGrid.isLoading = false;
this.updateUI();
})
}
E, finalmente, precisamos lidar com o comportamento por trás dos níveis hierárquicos reais da Cintura Hierárquica
public gridCreated(event: CustomEvent<IgcGridCreatedEventArgs>, parentKey: string) {
const context = event.detail;
const parentId: string = context.parentID;
const childDataKey: string = context.owner.childDataKey;
context.grid.isLoading = true;
RemotePagingService.getHierarchyDataById(parentKey, parentId, childDataKey)
.then((data: any) => {
context.grid.data = data;
context.grid.isLoading = false;
context.grid.markForCheck();
})
.catch((error) => {
console.error(error.message);
context.grid.data = [];
context.grid.isLoading = false;
context.grid.markForCheck();
});
}
public webHierarchicalGridPaginatorTemplate = () => {
return html `
<igc-paginator
id="islandPaginator">
</igc-paginator>`
}
Para mais referências, verifique a demonstração abaixo:
Grid Remote Paging Demo
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
API References
Additional Resources
Nossa comunidade é ativa e sempre acolhedora para novas ideias.