角度材料データテーブルをマスターする







みなさんこんにちは! 一般に、 このコンポーネントドキュメントは使用上の多くの問題をカバーしていますが、実際の開発の過程には多くの落とし穴があります。 私は彼らと彼らとどのように戦ったかについて話したいです。



コードの読みやすさ



ドキュメントの例:



<mat-table #table [dataSource]="dataSource"> <ng-container matColumnDef="position"> ... </ng-container> <ng-container matColumnDef="weight"> ... </ng-container> ... </mat-table>
      
      





これは私の読みやすさの概念に対応していないと言います。 また、テーブルに5つ以上の列がある場合、それは絶対にひどいものになります。 読みやすくする方法は次のとおりです。



 <mat-table [dataSource]="data"> <ng-container *ngFor="let column of columns" [matColumnDef]="column.key"> <mat-header-cell *matHeaderCellDef>{{ column.header }}</mat-header-cell> <mat-cell *matCellDef="let row">{{ column.cell(row) }}</mat-cell> </ng-container> ... </mat-table>
      
      





 columns = [ {key: 'position', header: 'Position', cell: (row: Row) => `${row.position}`}, {key: 'weight', header: 'Weight', cell: (row: Row) => `${row.weight}`}, ... ];
      
      





また、配列型のフィールドではソートが機能しないことに注意してください。 したがって、動的フィールドの名前に数字を追加してハードコーディングする必要がありました。



スティッキーヘッダー





 .mat-header-row { position: sticky; top: 0; background: white; z-index: 9999; }
      
      





このようなシンプルなソリューションで、スクロールするとヘッダー行がフリーズします。



これに限定されず、データを水平方向にスクロールするときに便利な静的サイドバーを作成することはできません(図の例)。 動的セルごとに[ngStyle]属性を使用します(上記の同様のスタイルを持つ各行の最初の2つ)。



また、水平スクロールは行の分離を壊します(そして粘着性のある部分については背景が壊れます)。 ここでのflex属性は優れたヘルパーであることがわかりました。



フィルターについて少し



表ページには、デフォルトのフィルタリングに関する重要な注意事項があります。

たとえば、データオブジェクト{id:123、name: 'Mr. Smith '、favoriteColor:' blue '}は123mrに減ります。 スミスブルー


個人的には、多くの場合、視覚的にフィルタリングする際に混乱が生じる(偶然の一致は見られない)ため、このアプローチは受け入れられません。 最も適切なオプションは、表示フィールドごとに個別にフィルタリングすることです。 さらに、このアプローチでは不可視フィールドを追加しないことをお勧めします(それらも独自の混乱をもたらします)。 しかし、開発者は解決策を提案しました。

デフォルトのフィルタリング動作をオーバーライドするには、データオブジェクトとフィルター文字列を受け取り、データオブジェクトが一致すると見なされる場合にtrueを返すカスタムfilterPredicate関数を設定できます。


 filterPredicate: ((data: T, filter: string) => boolean)
      
      





問題は解決しました。 デフォルトのフィルタリングをオーバーライドすることをお勧めします。



このような強力なフレームワークと注意をありがとう、Angular開発者に感謝します。








All Articles