Итерация таблицы угловых материалов

#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. В этом случае вы предлагаете мне использовать подход, который я привел в своем предыдущем комментарии. Есть ли какие-либо изменения в этом подходе, которые вы предлагаете?