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.