Использование статического массива в качестве источника данных для таблицы mat

Я пытаюсь использовать таблицу угловых материалов. Я пытаюсь использовать тот же код, что и в примерах, но я сталкиваюсь с проблемой, когда мне нужно определить [dataSource]="data",

Этот вопрос может показаться глупым, но мои данные таблицы представляют собой простой массив объектов, как я могу это реализовать?

для пояснения скажем, мои данные выглядят так:

public data = [{ ID: 1, Code: "Hi" }, { ID: 2, Code: "Bye" }];

Вот код, который у меня сейчас есть:

<div class="example-container mat-elevation-z8">
    <mat-table #table [dataSource]="data">
        <ng-container matColumnDef="number">
            <mat-header-cell *matHeaderCellDef> Number </mat-header-cell>
            <mat-cell *matCellDef="let row"> {{ row.ID }} </mat-cell>
        </ng-container>

        <ng-container matColumnDef="Code">
            <mat-header-cell *matHeaderCellDef> Code </mat-header-cell>
            <mat-cell *matCellDef="let row">{{row.Code}}</mat-cell>
        </ng-container>

        <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
        <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
    </mat-table>
</div>

2 ответа

Мне показалось, что предоставленные инструкции по угловой таблице материалов отсутствуют. Может быть, я могу помочь уточнить приведенные примеры.

<mat-table [dataSource]=”dataSource”>
  ...
</mat-table>
  • [dataSource]=”dataSource”: Это ваш фактический массив данных или источник данных, содержащий информацию, которую вы хотите отобразить. В вашем случае просто "данные".
  • Вам не нужно создавать новый источник данных, как указано в ответе Пьера Маллета, достаточно массива. Но если вы хотите сделать это, самый простой способ (придерживаясь имен из вашего примера):

    public dataSource = new MatTableDataSource(this.data);

    • Преимущества использования / расширения типа DataSource перечислены здесь в документации.
<ng-container matColumnDef="userName">
  <mat-header-cell *matHeaderCellDef> Name </mat-header-cell>
  <mat-cell *matCellDef="let user"> {{user.name}} </mat-cell>
</ng-container>
  • matColumnDef="userName": Это просто имя для идентификации этого ng-контейнера. Обратите внимание на отсутствие [] вокруг 'matColumnDef', это не является обязательным. Это не относится к данным, которые вы хотите отобразить, вы можете назвать их как угодно.

  • <mat-header-cell *matHeaderCellDef> Name </mat-header-cell>: Не так много здесь происходит. Просто замените "Имя" на любую строку, которую вы хотите отобразить в верхней части столбца.

  • Порядок, в котором вы размещаете ваши ng-контейнеры, не имеет значения. Фактически, определение ваших ng-контейнеров здесь не означает, что они будут отображаться вообще. Будет ли вообще отображаться ng-контейнер и в каком порядке будет решаться позже *matHeaderRowDef,

  • <mat-cell *matCellDef="let user"> {{user.name}} </mat-cell>: Здесь вы объявляете, что отображается как данные в этом столбце. Переменная 'user' объявлена ​​как h̲e̲r̲e̲ и не имеет явных знаний о ваших данных. Вы можете назвать эту переменную как угодно. Но вызываемое свойство, т. Е. "Имя", должно быть свойством, которое существует в данных, которые вы связываете с источником данных.

<mat-header-row *matHeaderRowDef="columnsToDisplay"></mat-header-row>

  • *matHeaderRowDef="columnsToDisplay": Это отвечает за определение того, какой из заголовков ng-контейнеров будет отображаться. 'columnsToDisplay' - строковый массив, содержащий имена, которые вы дали ng-контейнерам в качестве идентификаторов. Порядок расположения идентификаторов в этом массиве определяет порядок появления заголовков столбцов. Если вы опустите идентификатор ng-контейнера, этот контейнер не будет отображаться.

<mat-row *matRowDef="let myRowData; columns: columnsToDisplay"></mat-row>

  • Отображает строки в соответствующих столбцах. За исключением 'columnsToDisplay' переменные объявлены здесь.

Даже если вы используете статические данные, вам придется создавать новый источник данных.

mat-table всегда нужен реальный источник данных в @Input. DataSource является абстрактным классом, поэтому вы должны реализовать класс, который наследуется от DataSource.

В этом источнике данных должен быть реализован метод connect, который будет возвращать Observable данных, которые вы хотите отобразить.

Так что в вашем случае что-то подобное должно работать;

// in your component

interface MyDataType {
    ID: number;
    Code: string;
}

export class StaticDataSource extends DataSource<MyDataType> {
  constructor(private staticData: MyDataType[]) {
    super();
  }

  connect(): Observable<MyDataType[]> {
    return Observable.of(this.staticData);
  }

  disconnect() {}
}
...
this.staticDataSource = new StaticDataSource(data);

// in your template
 <mat-table #table [dataSource]="staticDataSource">
Другие вопросы по тегам