[解決済み] Angular Material 2 ネストされたオブジェクトによるデータテーブルのソート
2022-12-09 17:28:35
質問
通常のAngular Material 2のDataTableで、ソートヘッダーがあります。 すべてのソートヘッダーは問題なく動作します。値としてオブジェクトを持つものを除いて。 これらは全くソートされません。
例えば
<!-- Project Column - This should sort!-->
<ng-container matColumnDef="project.name">
<mat-header-cell *matHeaderCellDef mat-sort-header> Project Name </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.project.name}} </mat-cell>
</ng-container>
は
element.project.name
これがdisplayColumnの設定です。
displayedColumns = ['project.name', 'position', 'name', 'test', 'symbol'];
変更
'project.name'
を
'project'
は機能しませんし
"project['name']"
何が足りないのでしょうか?こんなことが可能なのでしょうか?
ここにスタックブリッツがあります。 Angular Material2 DataTableのソートオブジェクト
編集します。 たくさんのご回答ありがとうございます。 すでに動的データで動作させています。なので、新しいネストされたプロパティごとにswitch文を追加する必要はないですね。
以下は私の解決策です。(MatTableDataSourceを継承した新しいデータソースを作成することは必要ありません)
export class NestedObjectsDataSource extends MatTableDataSource<MyObjectType> {
sortingDataAccessor: ((data: WorkingHours, sortHeaderId: string) => string | number) =
(data: WorkingHours, sortHeaderId: string): string | number => {
let value = null;
if (sortHeaderId.indexOf('.') !== -1) {
const ids = sortHeaderId.split('.');
value = data[ids[0]][ids[1]];
} else {
value = data[sortHeaderId];
}
return _isNumberValue(value) ? Number(value) : value;
}
constructor() {
super();
}
}
どのように解決するのですか?
これに関するドキュメントを見つけるのは難しかったのですが、この方法は
sortingDataAccessor
とswitchステートメントを使うことで可能です。例えば
@ViewChild(MatSort) sort: MatSort;
ngOnInit() {
this.dataSource = new MatTableDataSource(yourData);
this.dataSource.sortingDataAccessor = (item, property) => {
switch(property) {
case 'project.name': return item.project.name;
default: return item[property];
}
};
this.dataSource.sort = sort;
}
関連
-
[解決済み] Angular:*ngClassを使った条件付きクラス
-
[解決済み] Angular Materialでのデフォルトのソート - ヘッダーのソート
-
[解決済み] Angular 2のFormGroupからすべての検証エラーを取得する
-
[解決済み] 継承と依存性注入
-
[解決済み] Angularでコンポーネントをリフレッシュする方法
-
[解決済み] trackBy` と `ngFor` の使い方
-
[解決済み] AngularでFormArrayからすべての項目を削除する
-
[解決済み] angular-cli が HTTPS で ng serve するようにする。
-
[解決済み] angular-cli server - APIリクエストを別のサーバーにプロキシする方法は?
-
[解決済み] Typescript におけるインターフェースとクラスの違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Mat-table Sortingデモが動作しない
-
[解決済み] 角度2 ngfor 最初、最後、インデックスループ
-
[解決済み] 別のプロセス(id #######)が現在 ngcc を実行しています。
-
[解決済み] 継承と依存性注入
-
[解決済み] Angular2でNgForがPipeでデータを更新しない。
-
[解決済み] .tsファイルはTypeScriptのコンパイルの一部ですが、使用されていませんという警告を消すには?
-
[解決済み] Error: モジュールによってインポートされた予期しない値 'undefined'。
-
[解決済み] FormGroupから単一の値を取得する方法
-
[解決済み] コンストラクタ注入を行わずにサービスのインスタンスを取得する
-
[解決済み] angularで1つの要素に複数のテンプレートバインディングを適用する方法 [重複].