Angular Tree Grid Remote Data Operations

    Ignite UI for Angular 원격 가상화, 원격 정렬, 원격 필터링 등과 같은 원격 데이터 작업을 지원합니다. 이를 통해 개발자는 서버에서 이러한 작업을 수행하고 생성된 데이터를 검색하여 Tree Grid에 표시할 수 있습니다.

    Angular Tree Grid 원격 데이터 작업 개요 예제

    EXAMPLE
    TS
    HTML
    SCSS

    이 샘플이 마음에 드시나요? 전체 Ignite UI for Angular 툴킷에 액세스하고 몇 분 안에 나만의 앱을 구축해 보세요. 무료로 다운로드하세요.

    기본적으로 트리 그리드는 데이터 작업을 수행하기 위해 자체 논리를 사용합니다. 이러한 작업을 원격으로 수행하고 트리 그리드에 의해 노출되는 특정 입력 및 이벤트를 활용하여 결과 데이터를 트리 그리드에 공급할 수 있습니다.

    원격 필터링

    원격 필터링을 제공하려면 받은 인수를 기반으로 적절한 요청을 할 수 있도록 filteringExpressionsTreeChange 출력을 구독해야 합니다. primaryKeyforeignKey 제공하여 트리 그리드의 데이터 소스로 플랫 컬렉션을 사용해 보겠습니다.

    또한 다른 소스 방출 없이 특정 시간 범위가 경과한 후에만 소스 Observable에서 값을 방출하는 rxjs ​ ​debounceTime 함수를 활용할 것입니다. 이렇게 하면 사용자가 방해하지 않고 지정된 시간이 경과한 경우에만 원격 작업이 트리거됩니다.

    const DEBOUNCE_TIME = 300;
    ...
    public ngAfterViewInit() {
        ...
        this.treeGrid.filteringExpressionsTreeChange.pipe(
            debounceTime(DEBOUNCE_TIME),
            takeUntil(this.destroy$)
        ).subscribe(() => {
            this.processData();
        });
    }
    typescript

    원격 필터링이 제공되면 일반적으로 트리 그리드의 내장 필터링이 필요하지 않습니다. Tree Grid의 filterStrategy 입력을 NoopFilteringStrategy 인스턴스로 설정하여 이를 비활성화할 수 있습니다.

    <!-- 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>
    html
    // 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;
        });
    }
    typescript

    원격 필터링은 플랫 컬렉션에 대해 직접 수행되어야 합니다. 또한 상위 항목이 필터링과 일치하는지 여부에 관계없이 필터링 조건과 일치하는 모든 레코드에 대해 모든 상위 항목을 포함해야 합니다(계층 구조를 그대로 유지하기 위해 이 작업을 수행함). 결과는 아래에서 볼 수 있습니다:

    원격 데이터가 요청되면 필터링 작업은 대소문자를 구분합니다.

    원격 필터링 데모

    데모 섹션의 이 문서 시작 부분에서 위의 코드 결과를 볼 수 있습니다.

    고유한 열 값 전략

    Excel 스타일 필터링 대화 상자 내의 목록 항목은 해당 열의 고유 값을 나타냅니다. 트리 그리드는 기본적으로 데이터 소스를 기반으로 이러한 값을 생성합니다. 원격 필터링의 경우 그리드 데이터에는 서버의 모든 데이터가 포함되지 않습니다. 고유한 값을 수동으로 제공하고 요청 시 로드하기 위해 트리 그리드의 uniqueColumnValuesStrategy 입력을 활용할 수 있습니다. 이 입력은 실제로 세 가지 인수를 제공하는 메서드입니다.

    • - 해당 열 인스턴스입니다.
    • filteringExpressionsTree- 해당 열을 기준으로 축소된 필터링 표현식 트리입니다.
    • done- 서버에서 검색될 때 새로 생성된 열 값으로 호출되어야 하는 콜백입니다.

    개발자는 열과​ ​filteringExpressionsTree 인수에서 제공되는 정보를 기반으로 필요한 고유 열 값을 수동으로 생성한 다음 완료 콜백을 호출할 수 있습니다.

    uniqueColumnValuesStrategy 입력이 제공되면 Excel 스타일 필터링의 기본 고유 값 생성 프로세스가 사용되지 않습니다.

    <igx-tree-grid #treeGrid [data]="data" [filterMode]="'excelStyleFilter'" [uniqueColumnValuesStrategy]="columnValuesStrategy">
        ...
    </igx-tree-grid>
    html
    public columnValuesStrategy = (column: ColumnType,
                                   columnExprTree: IFilteringExpressionsTree,
                                   done: (uniqueValues: any[]) => void) => {
        // Get specific column data.
        this.remoteValuesService.getColumnData(column, columnExprTree, uniqueValues => done(uniqueValues));
    }
    typescript

    고유한 열 값 전략 데모

    EXAMPLE
    TS
    HTML
    SCSS

    Excel 스타일 필터링을 위한 사용자 정의 로딩 템플릿을 제공하기 위해 igxExcelStyleLoading 지시문을 사용할 수 있습니다.

    <igx-tree-grid [data]="data" [filterMode]="'excelStyleFilter'" [uniqueColumnValuesStrategy]="columnValuesStrategy">
        ...
        <ng-template igxExcelStyleLoading>
            Loading ...
        </ng-template>
    </igx-tree-grid>
    html

    원격 페이징

    이 샘플에서는 하위 레코드 수에 관계없이 페이지당 특정 수의 루트 레코드를 표시하는 방법을 보여줍니다. 레벨(루트 또는 하위)에 관계없이 특정 수의 레코드를 표시하는 내장 트리 그리드 페이징 알고리즘을 취소하려면 perPage 속성을 Number.MAX_SAFE_INTEGER로 설정해야 합니다.

    <igx-tree-grid #treeGrid ...>
            <igx-paginator [perPage]="maxPerPage">
            </igx-paginator>
    ...
    html
    public maxPerPage = Number.MAX_SAFE_INTEGER;
    typescript

    이제 자체 사용자 정의 페이징 템플릿을 설정하거나 igx-paginator 제공하는 기본 템플릿을 사용하는 것 중에서 선택할 수 있습니다. 먼저 기본 페이징 템플릿을 사용하여 원격 페이징을 설정하는 데 필요한 것이 무엇인지 살펴보겠습니다.

    기본 템플릿을 사용한 원격 페이징

    기본 페이징 템플릿을 사용하려면 Paginator의 totalRecords 속성을 설정해야 합니다. 그래야만 그리드가 총 원격 레코드를 기반으로 총 페이지 수를 계산할 수 있습니다. 원격 페이지 매기기를 수행할 때 페이지네이터는 현재 페이지의 데이터만 그리드에 전달하므로 그리드는 제공된 데이터 소스에 페이지 매기기를 시도하지 않습니다. 그렇기 때문에 Grid의 pagingMode 속성을 GridPagingMode.remote로 설정해야 합니다. 또한 원격 서비스에서 데이터를 가져오려면 pagingDone 또는 perPageChange 이벤트를 구독해야 하며, 어떤 이벤트가 사용될 것인지는 사용 사례에 따라 다릅니다.

    <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>
    html
    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);
    }
    typescript

    EXAMPLE
    TS
    HTML
    SCSS

    사용자 정의 igx-paginator-content를 사용한 원격 페이징

    사용자 정의 페이지네이터 콘텐츠를 정의할 때 요청된 페이지에 대한 데이터만 가져오고 올바른 페이지를 전달하는 방식으로 콘텐츠를 정의해야 합니다. 건너뛰다 그리고 맨 위 선택한 페이지 및 항목에 따라 원격 서비스에 대한 매개변수 perPage. 우리는 <igx-paginator> 예제 구성을 쉽게 하기 위해 IgxPageSizeSelectorComponent 그리고 IgxPageNavigationComponent 소개되었던 -igx-page-size 페이지당 드롭다운과 라벨을 추가하고 igx-page-nav 탐색 작업 버튼과 라벨이 추가됩니다.

    <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>
    html
    public paginate(page: number) {
        this.page = page;
        const skip = this.page * this.perPage;
        const top = this.perPage;
    
        this.remoteService.getData(skip, top);
    }
    typescript

    원격 페이징을 올바르게 구성하려면 GridPagingMode.Remote 설정해야 합니다.

    <igx-tree-grid #treeGrid [data]="data | async" childDataKey="Content"
            expansionDepth="0" width="100%" height="540px" [pagingMode]="mode"></igx-tree-grid>
    ...
    public mode = GridPagingMode.Remote;
    html

    마지막 단계는 요구 사항에 따라 페이지네이터 콘텐츠를 선언하는 것입니다.

    <igx-paginator-content>
        <igx-page-size></igx-page-size>
        [This is my custom content]
        <igx-page-nav></igx-page-nav>
    </igx-paginator-content>
    html

    위의 모든 변경 후에는 다음과 같은 결과가 달성됩니다.

    EXAMPLE
    TS
    HTML
    SCSS

    알려진 문제 및 제한 사항

    • 그리드에 primaryKey 설정되지 않고 원격 데이터 시나리오가 활성화된 경우(그리드에 표시할 데이터를 검색하기 위해 원격 서버에 대한 페이징, 정렬, 필터링, 스크롤 트리거 요청 시) 행은 데이터 이후 다음 상태를 잃게 됩니다. 요청이 완료되었습니다:
      • 행 선택
      • 행 확장/축소
      • 행 편집
      • 행 고정
    • 원격 데이터 시나리오에서 그리드에 primaryKey 설정된 경우 rowSelectionChanging.oldSelection 이벤트 인수에는 현재 데이터 보기에 없는 행에 대한 전체 행 데이터 개체가 포함되지 않습니다. 이 경우 rowSelectionChanging.oldSelection 객체에는 primaryKey 필드인 하나의 속성만 포함됩니다. 현재 데이터 보기에 있는 나머지 행의 경우 rowSelectionChanging.oldSelection 전체 행 데이터가 포함됩니다.

    API 참조

    App Builder | CTA 배너

    추가 리소스

    우리 커뮤니티는 활동적이며 항상 새로운 아이디어를 환영합니다.