#angular #angular-material #material-design
#угловой #angular-материал #материал-дизайн
Вопрос:
Я использую Angular Material mat-table
и, насколько я вижу, у него есть специальное обозначение для свойств цикла *matCellDef
, как показано в этой демонстрации. Чтобы удалить ненужную часть, я пытаюсь выполнять итерации записей и динамически создавать таблицу. Я попытался выполнить итерацию с помощью <div let element of elements>...</div>
, но потерпел неудачу. Итак, возможно ли это с помощью специального синтаксиса?
Вот часть, которую я пытался повторить:
<ng-container matColumnDef="weight">
<th mat-header-cell *matHeaderCellDef> Weight </th>
<td mat-cell *matCellDef="let element"> {{element.weight}} </td>
</ng-container>
Комментарии:
1. MatTable автоматически привязывается к массивам. Просто задайте имена столбцов и имена свойств полей. Здесь праймер dev.to/jwp/angular-material-table-in-20-minutes-15f4
2. @JohnPeters Большое спасибо, это кажется полезным. Но в первой части я вижу, что имена столбцов не собираются из источника данных и не задаются статически. Почему я хочу это сделать, я хочу создать компонент базового списка и не задавать имена столбцов статически. Возможно ли это?
3. Mat-Table использует как отображаемые столбцы, так и отображаемые заголовки. Оба являются массивами, и оба могут быть переданы любым динамическим компонентом во время выполнения. Просто возьмите экземпляр MatTable и сделайте это. myMatTable.displayedColumns=[«col1″,»col2»] и myMatTable.displayedHeaders = [«Динамический заголовок 1», «Динамический заголовок 2»]
4. Спасибо за помощь. О чем
matColumnDef
? Должен ли я устанавливатьdefxxx
свойства в таблице материалов (mat * table)? И в чем разница междуmatColumnDef
и[matColumnDef]
?
Ответ №1:
Создайте повторно используемый компонент представления matTable, подобный этому:
Мы можем видеть, что columnHeaders — это массив.
<ng-container
*ngFor="let colName of columnHeaders; let i = index"
matColumnDef="{{ displayedColumns[i] }}"
>
Значения заголовка
<th mat-header-cell *matHeaderCellDef mat-sort-header>
<span>
{{ colName }}
</span>
</th>
Фактические значения строк с использованием массива displayedCoumns.
<td mat-cell *matCellDef="let row">
<span>
{{ row[displayedColumns[i]] }}
</span>
</td>
И привязка данных
<table
[id]="tableId"
matSort
mat-table
[(dataSource)]="dataSource"
>...
Это позволяет вводить источник данных, который представляет собой массив чего угодно, а также массив заголовков столбцов и dsiplaycolumns, подобных этому:
Чтобы повторно использовать компонент matTable, показанный выше, мы можем ввести заголовки столбцов, отображаемые столбцы и источник данных, как показано в этом коде.
@ViewChild(ParentComponent) matTable:ParentComponent
displayedColumns = ["id", "firstName", "lastName", "updated", "actions"];
columnHeaders = ["ID", "First Name", "Last Name", "Last Updated", "Actions"];
private setTableColumns() {
if (this.people.length > 0) {
this.matTable.displayedColumns = this.displayedColumns;
this.matTable.columnHeaders = this.columnHeaders;
this.matTable.dataSource = this.myArray;
}
}
Или как это в html, предполагая, что app-material-table является многоразовым представлением, показывающим наличие привязок, показанных выше.
<app-material-table
[dataSoure]="myArray"
[columnHeaders]="columnHeaders"
[displayedColumns]="displayedColumns"
</app-material-table>
Примечание: Всякий раз, когда я вижу что-то вроде MatTable, я сразу же думаю о создании более упрощенного многоразового представления, которое абстрагирует знания об его использовании от чего-то более простого, как показано выше.
Комментарии:
1. Большое спасибо за вашу помощь. Что касается вашей заметки, вы имеете в виду что-то вроде этого примера? Я последовал за этим и, кажется, все в порядке. Любой комментарий к нему (у него также есть страница GitHub ).
2. Спасибо за сообщение, мне тоже интересно увидеть это решение.
3. В этом случае вы предлагаете мне использовать подход, который я привел в своем предыдущем комментарии. Есть ли какие-либо изменения в этом подходе, которые вы предлагаете?