Angular 그리드 행 고정
하나 이상의 행을 Angular UI 그리드의 상단이나 하단에 고정할 수 있습니다. Ignite UI for Angular의 행 고정을 사용 하면 최종 사용자가 특정 순서로 행을 고정하여 그리드를 수직으로 스크롤할 때에도 항상 표시되는 특수 영역에 행을 복제할 수 있습니다. Material UI 그리드에는 그리드 컨텍스트에서 igxActionStrip
구성 요소를 초기화하여 활성화되는 행 고정 UI가 내장되어 있습니다. 또한 Row Pinning API를 통해 사용자 정의 UI를 정의하고 행의 고정 상태를 변경할 수 있습니다.
Angular Grid Row Pinning Example
Row Pinning UI
내장 행 고정 UI는 GridPinningActions
구성 요소와 함께 igxActionStrip
구성 요소를 추가하여 활성화됩니다. 행을 마우스로 가리키면 작업 스트립이 자동으로 표시되며 표시된 행의 상태에 따라 고정 또는 고정 해제 버튼 아이콘이 표시됩니다. 고정된 행의 복사본을 보기로 스크롤할 수 있는 추가 작업도 고정된 각 행에 대해 표시됩니다.
<igx-grid [data]="data" [autoGenerate]="false">
<igx-column *ngFor="let c of columns" [field]="c.field" [header]="c.field">
</igx-column>
<igx-action-strip #actionStrip>
<igx-grid-pinning-actions></igx-grid-pinning-actions>
<igx-grid-editing-actions></igx-grid-editing-actions>
</igx-action-strip>
</igx-grid>
Row Pinning API
행 고정은 다음을 통해 제어됩니다. pinned
의 입력 row
. 고정된 행은 기본적으로 Grid 상단에 렌더링되며 Grid 본문에서 고정 해제된 행의 세로 스크롤을 통해 고정된 상태로 유지됩니다.
this.grid.getRowByIndex(0).pinned = true;
IgxGridComponent
의 Grid pinRow
또는 unpinRow
메소드를 사용하여 ID별로 레코드를 고정하거나 고정 해제할 수도 있습니다.
this.grid.pinRow('ALFKI');
this.grid.unpinRow('ALFKI');
행 ID는 그리드의 primaryKey
또는 레코드 인스턴스 자체에 의해 정의된 기본 키 값입니다. 두 메서드 모두 해당 작업의 성공 여부를 나타내는 부울 값을 반환합니다. 일반적으로 실패하는 이유는 행이 이미 원하는 상태에 있기 때문입니다.
행은 마지막으로 고정된 행 아래에 고정됩니다. 고정된 행의 순서를 변경하려면 rowPinning
이벤트를 구독하고 이벤트 인수의 insertAtIndex
속성을 원하는 위치 인덱스로 변경하면 됩니다.
<igx-grid #grid1 [data]="data" [autoGenerate]="true" (rowPinning)="rowPinning($event)">
</igx-grid>
public rowPinning(event) {
event.insertAtIndex = 0;
}
Pinning Position
pinning
구성 옵션을 통해 행 고정 위치를 변경할 수 있습니다. 핀 영역 위치를 상단 또는 하단으로 설정할 수 있습니다. 아래쪽으로 설정하면 고정된 행이 고정 해제된 행 뒤의 그리드 아래쪽에 렌더링됩니다. 고정 해제된 행은 세로로 스크롤할 수 있지만 고정된 행은 아래쪽에 고정된 상태로 유지됩니다.
<igx-grid [data]="data" [autoGenerate]="true" [pinning]="pinningConfig"></igx-grid>
public pinningConfig: IPinningConfig = { rows: RowPinningPosition.Bottom };
Custom Row Pinning UI
사용자 정의 UI를 정의하고 관련 API를 통해 행의 핀 상태를 변경할 수 있습니다.
Via extra column with icon
액션 스트립 대신 최종 사용자가 클릭하여 특정 행의 핀 상태를 변경할 수 있도록 모든 행에 핀 아이콘을 표시하고 싶다고 가정해 보겠습니다. 이는 사용자 정의 아이콘이 포함된 셀 템플릿이 있는 추가 열을 추가하여 수행할 수 있습니다.
<igx-grid [data]="data" [primaryKey]="'ID'" [autoGenerate]="false">
<igx-column width="70px">
<ng-template igxCell let-cell="cell" let-val>
<igx-icon class="pin-icon" (mousedown)="togglePinning(cell.row, $event)">
{{cell.row.pinned ? 'lock' : 'lock_open'}}
</igx-icon>
</ng-template>
</igx-column>
<igx-column *ngFor="let c of columns" [field]="c.field" [header]="c.field">
</igx-column>
</igx-grid>
사용자 정의 아이콘을 클릭하면 해당 행의 API 메소드를 사용하여 관련 행의 고정 상태를 변경할 수 있습니다.
public togglePinning(row: IgxGridRow, event) {
event.preventDefault();
if (row.pinned) {
row.unpin();
} else {
row.pin();
}
}
데모
Via row drag
고정된 행과 고정 해제된 행 사이에 행을 직접 끌어서 놓아 핀 상태를 변경할 수 있다고 가정해 보겠습니다. 이는 행 끌기 기능을 활성화하고 놓을 때 API를 통해 행을 고정/고정 해제하여 수행할 수 있습니다.
먼저, igxDrop
지시어를 사용하여 그리드를 드롭 영역으로 표시해야 하며 rowDraggable
옵션을 통해 행 드래그 기능을 활성화해야 합니다.
<igx-grid [data]="data" [autoGenerate]="true" [rowDraggable]="true"
[primaryKey]="'ID'" igxDrop (dropped)="onDropAllowed($event)">
</igx-grid>
그런 다음 dropped
이벤트를 사용하여 재정렬 및 고정/고정 해제 논리를 처리할 수 있습니다.
public onDropAllowed(args) {
const event = args.originalEvent;
let currRowPinnedIndex;
const currRowIndex = this.getCurrentRowIndex(this.grid.rowList.toArray(),
{ x: event.clientX, y: event.clientY });
if (currRowIndex === -1) { return; }
const currRowID = this.getCurrentRowID(this.grid.rowList.toArray(),
{ x: event.clientX, y: event.clientY });
const currentRow = this.grid.rowList.toArray().find((r) => r.rowID === currRowID);
if (currentRow.pinned) {
currRowPinnedIndex = this.grid.pinnedRows.indexOf(this.grid.pinnedRows.find((r) => r.rowID === currRowID));
}
// remove the row that was dragged and place it onto its new location
this.grid.deleteRow(args.dragData.key);
this.data.splice(currRowIndex, 0, args.dragData.data);
if (currentRow.pinned && !args.dragData.pinned) {
this.grid.pinRow(args.dragData.key, currRowPinnedIndex);
} else if (!currentRow.pinned && args.dragData.pinned) {
this.grid.unpinRow(args.dragData.key);
} else if (currentRow.pinned && args.dragData.pinned) {
this.grid.unpinRow(args.dragData.key);
this.grid.pinRow(args.dragData.key, currRowPinnedIndex);
}
}
이렇게 하면 행을 다시 정렬하고 고정된 행 컬렉션과 고정 해제된 행 컬렉션 간에 이동할 수 있습니다.
데모
Row Pinning Limitations
- 데이터 원본에 존재하는 레코드만 고정할 수 있습니다.
- 행 고정 상태는 Excel로 내보내지지 않습니다. 행 고정이 적용되지 않은 것처럼 그리드가 내보내집니다.
- 고정된 행이 그리드의 고정된 영역과 고정 해제된 영역 모두에 나타날 수 있도록 내부적으로 저장되는 방식으로 인해 그리드의 레코드를 요청 시 원격 끝점에서 가져올 때(원격 가상화) 행 고정이 지원되지 않습니다.
- 그리드의 스크롤 가능 영역에 있는 고정된 행의 복사본은 고정된 행이 있을 때 다른 그리드 기능이 해당 기능을 달성하는 방법의 필수 부분이므로 생성을 비활성화하거나 제거할 수 없습니다.
- 행 선택은 전적으로 행 ID와 함께 작동하므로 고정된 행을 선택하면 해당 복사본도 선택됩니다(그 반대도 마찬가지). 또한 고정된 영역 내에서 범위 선택(예: Shift + 클릭 사용)은 스크롤 가능한 영역 내에서 행 범위를 선택하는 것과 동일한 방식으로 작동합니다. 결과 선택에는 현재 고정되어 있지 않은 경우에도 그 사이의 모든 행이 포함됩니다. API를 통해 선택한 행을 가져오면 선택한 각 레코드의 단일 인스턴스만 반환됩니다.
- 그리드에
primaryKey
설정되지 않고 원격 데이터 시나리오가 활성화된 경우(그리드에 표시할 데이터를 검색하기 위해 원격 서버에 대한 페이징, 정렬, 필터링, 스크롤 트리거 요청 시) 행은 데이터 이후 다음 상태를 잃게 됩니다. 요청이 완료되었습니다:- 행 선택
- 행 확장/축소
- 행 편집
- 행 고정
스타일링
IgxGrid를 사용하면 Ignite UI for Angular 통해 스타일을 지정할 수 있습니다. Grid의 테마는 Grid의 모든 기능을 사용자 정의할 수 있는 다양한 속성을 노출합니다.
아래에서는 그리드의 행 고정 스타일을 사용자 지정하는 단계를 살펴보겠습니다.
Importing the Styling Library
행 고정 기능의 사용자 정의를 시작하려면 모든 스타일링 기능과 믹스인이 있는 index
파일을 가져와야 합니다.
@use "igniteui-angular/theming" as *;
// IMPORTANT: Prior to Ignite UI for Angular version 13 use:
// @import '~igniteui-angular/lib/core/styles/themes/index';
Defining a Theme
다음으로, grid-theme
확장하고 원하는 대로 행 고정 기능을 사용자 정의하는 데 필요한 매개변수를 허용하는 새 테마를 만듭니다.
$custom-grid-theme: grid-theme(
/* Pinning properties that affect styling */
$pinned-border-width: 5px,
$pinned-border-style: double,
$pinned-border-color: #FFCD0F,
$cell-active-border-color: #FFCD0F
/* add other features properties here... */
);
Using CSS variables
마지막 단계는 사용자 정의 그리드 테마를 전달하는 것입니다.
@include css-vars($custom-grid-theme);
Using mixins
Internet Explorer 11에서는 구성 요소의 스타일을 지정하려면 CSS 변수를 지원하지 않으므로 다른 접근 방식을 사용해야 합니다.
구성 요소가 Emulated
ViewEncapsulation을 사용하는 경우::ng-deep
사용하여 이 캡슐화를 penetrate
해야 합니다. 그러나 사용자 정의 테마가 다른 구성 요소로 누출되는 것을 방지하려면::ng-deep
앞에:host
선택기를 포함해야 합니다.
:host {
::ng-deep {
// Pass the custom grid theme to the `igx-grid` mixin
@include grid($custom-grid-theme);
}
}
데모
Note
샘플은 Change Theme
에서 선택한 전역 테마의 영향을 받지 않습니다.