Angular создает повторно используемую / общую html-структуру

#angular #generics #concatenation #expression #reusability

#angular #общие #конкатенация #выражение #возможность повторного использования

Вопрос:

Я думал, что это будет легко, но я не могу найти никакого решения для своей проблемы.

Итак, я хочу создать общий table.component. Моя идея состоит в том, чтобы предоставить всю необходимую информацию, выполнив некоторые выражения в html-коде.

данные данные выглядят следующим образом:

   myData: [
    {
      id: 1,
      name: 'name1',
      stuff: 'stuff..'
    },...
]
 

таблица.компонент:

Моя мысль состоит в том, чтобы использовать идентификаторы / заголовки столбцов для получения информации о данных из tableData — что-то вроде этого: {{row}}.{{item}} // item — идентификатор столбца, в противном item случае — идентификатор для значений данных и row является текущим элементом вне цикла.

 @Component({
  selector: 'app-table',
  template: `
    <div class="{{tableName}}-header">
      <h3>{{tableName}}</h3>
    </div>
    <div class="{{tableName}}-content">
      <table mat-table [dataSource]="tableData" class="">
       
        <div *ngFor="let item of displayedColumns">
          <ng-container matColumnDef="{{item}}">

            <th mat-header-cell *matHeaderCellDef> {{item}} </th>
            <td mat-cell *matCellDef="let row"> {{row}}.{{item}} </td>

          </ng-container>
        </div>
        <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
      </table>
    </div>
  `,

  styleUrls: ['./table.component.css']
})
export class TableComponent implements OnInit {
  @Input() tableName: string;
  @Input() tableData: any;

  displayedColumns: string[] = ['id',  'name', 'stuff'];

  // doing in other component.
  tableData = myData;
 

Есть ли (простой) способ объединить два выражения для создания нового выражения? (разобрать два выражения в строку, объединить их в точечную нотацию и проанализировать их обратно в выражение?)

Ответ №1:

Для динамического доступа к свойству объекта row вы должны использовать обозначение скобок вместо обозначения точек:

 <td mat-cell *matCellDef="let row"> {{row[item]}} </td>
 

Кроме того, поскольку вы используете Angular Material, вам может быть интересно использовать их MatTextColumn вместо этого: https://material.angular.io/components/table/api#MatTextColumn

Ответ №2:

Вы можете создать функцию, которая принимает row и item в качестве параметра:

 getDataBy(row, item) => {
    return this.myData[row][item]
}
 

Комментарии:

1. Да, спасибо, достаточно даже этого обозначения {{строка [элемент]}} :)!