Angular Hierarchical Grid のソート
Ignite UI for Angular Hierarchical Grid では、列レベルでのデータ ソートが可能です。つまり、igx-hierarchical-grid にソート可能な列とソート不可の列の両方を持つことができます。Angular でソートを実行すると、指定した条件に基づいてレコードの表示順序を変更できます。
これまで、グループ化 / ソートは互いに連携して機能していました。13.2 バージョンでは、グループ化をソートから切り離す新しい動作が導入されています。たとえば、グループ化をクリアしても、グリッド内のソート式はクリアされません。その逆も同様です。それでも、列がソートおよびグループ化されている場合は、グループ化された式が優先されます。
Angular Hierarchical Grid ソートの例
更に igx-hierarchical-grid の contextMenu
出力を使用してソートにカスタム コンテキスト メニューが追加されます。
import { NgModule } from "@angular/core" ;
import { FormsModule } from "@angular/forms" ;
import { BrowserModule } from "@angular/platform-browser" ;
import { BrowserAnimationsModule } from "@angular/platform-browser/animations" ;
import { AppComponent } from "./app.component" ;
import { IgxHierarchicalGridModule } from "igniteui-angular" ;
import { HGridSortingSampleComponent } from "./hierarchical-grid/hierarchical-grid-sorting/hierarchical-grid-sorting.component" ;
import { HGridContextmenuComponent } from "./hierarchical-grid/hierarchical-grid-sorting/hgrid-contextmenu/hgrid-contextmenu.component" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
HGridSortingSampleComponent,
HGridContextmenuComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core' ;
import { DefaultSortingStrategy, IgxHierarchicalGridComponent,
IgxRowIslandComponent, SortingDirection } from 'igniteui-angular' ;
import { SINGERS } from '../../data/singersData' ;
@Component ({
selector : 'app-hierarchical-grid-sorting' ,
styleUrls : ['./hierarchical-grid-sorting.component.scss' ],
templateUrl : 'hierarchical-grid-sorting.component.html'
})
export class HGridSortingSampleComponent implements OnInit , AfterViewInit {
@ViewChild ('hierarchicalGrid' , { static : true })
private hierarchicalGrid: IgxHierarchicalGridComponent;
public localdata;
public contextmenu = false ;
public contextmenuX = 0 ;
public contextmenuY = 0 ;
public clickedCell = null ;
constructor ( ) {}
public ngOnInit(): void {
this .localdata = SINGERS;
this .hierarchicalGrid.sortingExpressions = [
{ dir : SortingDirection.Asc, fieldName : 'Artist' ,
ignoreCase : true , strategy : DefaultSortingStrategy.instance() }
];
}
public ngAfterViewInit(): void {
this .hierarchicalGrid.cdr.detectChanges();
}
public rightClick (eventArgs ) {
eventArgs.event.preventDefault();
this .contextmenuX = eventArgs.event.clientX;
this .contextmenuY = eventArgs.event.clientY;
this .contextmenu = true ;
this .clickedCell = eventArgs.cell;
}
public disableContextMenu ( ) {
this .contextmenu = false ;
}
public formatter = (a ) => a;
}
ts コピー <div class ="hgrid-sample" (window:click )="disableContextMenu()" >
<igx-hierarchical-grid [igxPreventDocumentScroll ]="true" class ="hgrid" [data ]="localdata" [autoGenerate ]="false"
[height ]="'480px'" [width ]="'100%'" [rowHeight ]="'65px'" (contextMenu )="rightClick($event)" #hierarchicalGrid >
<igx-column field ="Artist" [sortable ]="true" > </igx-column >
<igx-column field ="Photo" >
<ng-template igxCell let-cell ="cell" >
<div class ="cell__inner_2" >
<img [src ]="cell.value" class ="photo" />
</div >
</ng-template >
</igx-column >
<igx-column field ="Debut" [sortable ]="true" [formatter ]="formatter" > </igx-column >
<igx-column field ="GrammyNominations" header ="Grammy Nominations" [sortable ]="true" > </igx-column >
<igx-column field ="GrammyAwards" header ="Grammy Awards" [sortable ]="true" > </igx-column >
<igx-row-island [height ]="null" [key ]="'Albums'" [autoGenerate ]="false" >
<igx-column field ="Album" [sortable ]="true" > </igx-column >
<igx-column field ="LaunchDate" header ="Launch Date" [sortable ]="true" [dataType ]="'date'" > </igx-column >
<igx-column field ="BillboardReview" header ="Billboard Review" [sortable ]="true" > </igx-column >
<igx-column field ="USBillboard200" header ="US Billboard 200" [sortable ]="true" > </igx-column >
<igx-row-island [height ]="null" [key ]="'Songs'" [autoGenerate ]="false" >
<igx-column field ="Number" header ="No." [sortable ]="true" > </igx-column >
<igx-column field ="Title" [sortable ]="true" > </igx-column >
<igx-column field ="Released" dataType ="date" [sortable ]="true" > </igx-column >
<igx-column field ="Genre" [sortable ]="true" > </igx-column >
</igx-row-island >
</igx-row-island >
<igx-row-island [height ]="null" [key ]="'Tours'" [autoGenerate ]="false" >
<igx-column field ="Tour" [sortable ]="true" > </igx-column >
<igx-column field ="StartedOn" header ="Started on" [sortable ]="true" > </igx-column >
<igx-column field ="Location" [sortable ]="true" > </igx-column >
<igx-column field ="Headliner" [sortable ]="true" > </igx-column >
</igx-row-island >
</igx-hierarchical-grid >
<div *ngIf ="contextmenu" >
<app-hgrid-contextmenu [x ]="contextmenuX" [y ]="contextmenuY" [cell ]="clickedCell" > </app-hgrid-contextmenu >
</div >
</div >
html コピー .photo {
vertical-align : middle;
max-height : 62px ;
}
.cell__inner_2 {
margin : 1px
}
.hgrid-sample{
padding: 16px ;
}
scss コピー
このサンプルが気に入りましたか? 完全な Ignite UI for Angularツールキットにアクセスして、すばやく独自のアプリの作成を開始します。無料でダウンロードできます。
sortable
入力で可能です。Hierarchical Grid のソートで、sortingIgnoreCase
プロパティを設定して大文字と小文字を区別するソートができます。
<igx-column field ="ProductName" header ="Product Name" [dataType ]="'string'" sortable ="true" > </igx-column >
html
ソート インジケーター
ソートされた列数が一定数以上ある場合、ソート順の指定がないと混乱する可能性があります。
IgxHierarchicalGrid は、ソートされた各列のインデックスを示すことにより、この問題の解決策を提供します。
API を使用したソート
Hierarchical Grid sort
メソッドを使用して列、複数の列の組み合わせをソートできます。
import { SortingDirection } from 'igniteui-angular' ;
this .hierarchicalGrid.sort({ fieldName : 'ProductName' , dir : SortingDirection.Asc, ignoreCase : true });
this .hierarchicalGrid.sort([
{ fieldName : 'ProductName' , dir : SortingDirection.Asc, ignoreCase : true },
{ fieldName : 'Price' , dir : SortingDirection.Desc }
]);
typescript
フィルター動作で、ソート状態をクリアするには clearSort
メソッドを使用します。
this .hierarchicalGrid.clearSort('ProductName' );
this .hierarchicalGrid.clearSort();
typescript
ソート操作で Hierarchical Grid の基になるデータ ソースは変更しません 。
初期のソート状態
Hierarchical Grid でソート状態を初期設定するには、ソート式の配列を Hierarchical Grid の sortingExpressions
プロパティに渡します。
public ngOnInit(): void {
this .hierarchicalGrid.sortingExpressions = [
{
dir : SortingDirection.Asc, fieldName : 'Artist' ,
ignoreCase : true , strategy : DefaultSortingStrategy.instance()
}
];
}
typescript
string
型の値が dataType
Date
の列で使用される場合、Hierarchical Grid が値を Date
オブジェクトに解析しないため iHierarchical Grid sorting
が正しく動作しません。string
オブジェクトを使用する場合、値を Date
オブジェクトに解析するためのロジックをアプリケーション レベルで実装する必要があります。
ソート インジケーのターテンプレート
列ヘッダーのソート インジケーター アイコンは、テンプレートを使用してカスタマイズできます。以下のディレクティブは、ソート状態 (昇順、降順、なし) のソート インジケーターをテンプレート化するために使用できます。
IgxSortHeaderIconDirective
– ソートが適用されない場合にソート アイコンを再テンプレート化します。
<ng-template igxSortHeaderIcon >
<igx-icon > unfold_more</igx-icon >
</ng-template >
html
IgxSortAscendingHeaderIconDirective
– 列が昇順にソートされたときにソート アイコンを再テンプレート化します。
<ng-template igxSortAscendingHeaderIcon >
<igx-icon > expand_less</igx-icon >
</ng-template >
html
IgxSortDescendningHeaderIconDirective
– 列が降順でソートされたときにソート アイコンを再テンプレート化します。
<ng-template igxSortDescendingHeaderIcon >
<igx-icon > expand_more</igx-icon >
</ng-template >
html
スタイル設定
ソート動作のスタイル設定は、すべてのテーマ関数とコンポーネント ミックスインが存在する index
ファイルをインポートする必要があります。
@use "igniteui-angular/theming" as *;
scss
最も単純なアプローチに従って、grid-theme
を拡張し、$sorted-header-icon-color
および sortable-header-icon-hover-color
パラメーターを受け取ります。
$custom-theme : grid-theme(
$sorted-header-icon-color : #ffb06a ,
$sortable-header-icon-hover-color : black
);
scss
上記のようにカラーの値をハードコーディングする代わりに、palette
および color
関数を使用してカラーに関してより高い柔軟性を実現することができます。使い方の詳細についてはパレット
のトピックをご覧ください。
最後の手順は、それぞれのテーマを持つコンポーネント ミックスインを含める ことです。
@include css-vars($custom-theme );
scss
デモ
import { NgModule } from "@angular/core" ;
import { FormsModule } from "@angular/forms" ;
import { BrowserModule } from "@angular/platform-browser" ;
import { BrowserAnimationsModule } from "@angular/platform-browser/animations" ;
import { AppComponent } from "./app.component" ;
import { IgxHierarchicalGridModule } from "igniteui-angular" ;
import { HGridSortingStylingComponent } from "./hierarchical-grid/hierarchical-grid-sorting-styling/hierarchical-grid-sorting-styling.component" ;
import { IgxPreventDocumentScrollModule } from "./directives/prevent-scroll.directive" ;
@NgModule ({
bootstrap : [AppComponent],
declarations : [
AppComponent,
HGridSortingStylingComponent
],
imports : [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
IgxPreventDocumentScrollModule,
IgxHierarchicalGridModule
],
providers : [],
entryComponents : [],
schemas : []
})
export class AppModule {}
ts コピー import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core' ;
import { DefaultSortingStrategy, IgxHierarchicalGridComponent, SortingDirection } from 'igniteui-angular' ;
import { SINGERS } from '../../data/singersData' ;
@Component ({
selector : 'app-hierarchical-grid-sorting-styling' ,
styleUrls : ['./hierarchical-grid-sorting-styling.component.scss' ],
templateUrl : 'hierarchical-grid-sorting-styling.component.html'
})
export class HGridSortingStylingComponent implements OnInit , AfterViewInit {
@ViewChild ('hierarchicalGrid' , { static : true })
private hierarchicalGrid: IgxHierarchicalGridComponent;
public localdata;
constructor ( ) {}
public ngOnInit(): void {
this .localdata = SINGERS;
this .hierarchicalGrid.sortingExpressions = [
{ dir : SortingDirection.Asc, fieldName : 'Artist' ,
ignoreCase : true , strategy : DefaultSortingStrategy.instance() }
];
}
public ngAfterViewInit(): void {
this .hierarchicalGrid.cdr.detectChanges();
}
public formatter = (a ) => a;
}
ts コピー <div class ="hgrid-sample" >
<igx-hierarchical-grid [igxPreventDocumentScroll ]="true" class ="hgrid" [data ]="localdata" [autoGenerate ]="false" [height ]="'480px'" [width ]="'100%'"
[rowHeight ]="'65px'" #hierarchicalGrid >
<igx-column field ="Artist" [sortable ]="true" > </igx-column >
<igx-column field ="Photo" >
<ng-template igxCell let-cell ="cell" >
<div class ="cell__inner_2" >
<img [src ]="cell.value" class ="photo" />
</div >
</ng-template >
</igx-column >
<igx-column field ="Debut" [sortable ]="true" [formatter ]="formatter" > </igx-column >
<igx-column field ="GrammyNominations" header ="Grammy Nominations" [sortable ]="true" > </igx-column >
<igx-column field ="GrammyAwards" header ="Grammy Awards" [sortable ]="true" > </igx-column >
<igx-row-island [height ]="null" [key ]="'Albums'" [autoGenerate ]="false" >
<igx-column field ="Album" [sortable ]="true" > </igx-column >
<igx-column field ="LaunchDate" header ="Launch Date" [sortable ]="true" [dataType ]="'date'" > </igx-column >
<igx-column field ="BillboardReview" header ="Billboard Review" [sortable ]="true" > </igx-column >
<igx-column field ="USBillboard200" header ="US Billboard 200" [sortable ]="true" > </igx-column >
<igx-row-island [height ]="null" [key ]="'Songs'" [autoGenerate ]="false" >
<igx-column field ="Number" header ="No." [sortable ]="true" > </igx-column >
<igx-column field ="Title" [sortable ]="true" > </igx-column >
<igx-column field ="Released" dataType ="date" [sortable ]="true" > </igx-column >
<igx-column field ="Genre" [sortable ]="true" > </igx-column >
</igx-row-island >
</igx-row-island >
<igx-row-island [height ]="null" [key ]="'Tours'" [autoGenerate ]="false" >
<igx-column field ="Tour" [sortable ]="true" > </igx-column >
<igx-column field ="StartedOn" header ="Started on" [sortable ]="true" > </igx-column >
<igx-column field ="Location" [sortable ]="true" > </igx-column >
<igx-column field ="Headliner" [sortable ]="true" > </igx-column >
</igx-row-island >
</igx-hierarchical-grid >
</div >
html コピー @use '../../../variables' as *;
$custom-theme : grid-theme(
$sorted-header-icon-color : #ffb06a ,
$sortable-header-icon-hover-color : black
);
:host ::ng-deep {
@include css-vars($custom-theme );
}
.photo {
vertical-align : middle;
max-height : 62px ;
}
.cell__inner_2 {
margin : 1px
}
.hgrid-sample{
padding: 16px ;
}
scss コピー
このサンプルは、Change Theme
(テーマの変更) から選択したグローバル テーマに影響を受けません。
API リファレンス
その他のリソース
コミュニティに参加して新しいアイデアをご提案ください。