Хай, я работаю над веб-приложением в угловой 5. В этом приложении мы используем угловатый материал. На одной из страниц у нас есть мат-стол, но мы не можем заставить его работать. Таблица никогда не показывает нам никаких данных. Данные, которые мы вызываем из нескольких бэкэндов и с помощью отладчика, мы знаем, что данные не равны нулю. Даже если мы попытаемся использовать пример материала angular, это все равно не сработает. Что мы не так?
HTML
<mat-table #invoiceTable [dataSource] = "datasource" matSort>
<ng-container matColumnDef = "SerialNr">
<th mat-header-cell *matHeaderCellDef> SerialNr. </th>
<td mat-cell *matCellDef = "let movement" > {{movement?.serialNr}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef = "displayedColumns"></tr>
<tr mat-row *matRowDef = "let row; columns: displayedColumns;">
</tr>
</mat-table>
TS
displayedColumns = ['SerialNr'];
movements = [];
// datasource = new MatTableDataSource<Movement>(this.movements);
datasource: MovementDataSource;
getMovementsByVehicleID() {
this.authUser.ownedVehicles.forEach((vehicle) => {
this.movementService.getMovementsByCarID(vehicle.id).subscribe(
(newMovemnts) => {
this.movements = newMovemnts;
this.datasource.update(newMovemnts);
},
);
}
);
}
export class MovementDataSource extends DataSource<Movement> {
constructor(private movements: Movement[]) {
super();
}
connect(): Observable<Movement[]> {
return Observable.of(this.movements);
}
update(movements: Movement[]) {
movements.forEach((move) => {
this.movements.push(move);
});
}
disconnect(collectionViewer: CollectionViewer): void {
}
}
МАТЕРИАЛ.ТС
@NgModule({
imports: [
MatButtonModule,
MatToolbarModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatMenuModule,
MatPaginatorModule,
MatSidenavModule,
MatSnackBarModule,
MatCardModule,
MatTableModule,
MatSortModule,
MatProgressSpinnerModule,
CdkTableModule,
],
exports: [
MatButtonModule,
MatToolbarModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatMenuModule,
MatPaginatorModule,
MatSidenavModule,
MatSnackBarModule,
MatCardModule,
MatTableModule,
MatSortModule,
MatProgressSpinnerModule,
CdkTableModule
],
declarations: []
})
export class MaterialModule {
}
Мы много чего перепробовали. это последняя версия, но она все еще не работает. Конечно, мы добавили модуль материала в импорт app.module.ts. Странно то, что даже примеры не работают. Любые идеи?
Я обновил свой вопрос. Это все еще не работает
да. на других страницах я использую другие компоненты материала, но не работает только таблица
Обнаружение изменений может быть проблемой ... Вы выполняете обнаружение изменений вручную ... В родительском компоненте или в том же компоненте
Что вы имеете в виду под детектированием?
попробуйте добавить DI следующим образом: constructor (private ref: ChangeDetectorRef) и добавьте эту строку this.ref.detectChanges (); перед этим .movements = newMovemnts;





По документации Стол | Угловой материал,
<th mat-header-cell *matHeaderCellDef> SerialNr. </th> должен быть частью ng-контейнера согласно документации. Пробовал без него, и таблица не отображается. В вашем случае это отсутствует.displayedColumns должен быть массивом строк, который содержит столбцы, которые необходимо отобразить. Я вижу, что этого тоже не хватает в вашем component.ts. В вашем случае это должен быть displayedColumns = ['SerialNr'];Остальное все выглядит нормально.
Разветвил существующий пример на stackblitz
Я включил ваш ответ, но он все еще не работает.
Можете ли вы создать проект stackblitz, чтобы его было легко отлаживать
У меня была та же проблема, и я забыл вызвать метод renderRows () при обновлении асинхронных данных. См. Документацию по таблице материалов Angular 5 https://v5.material.angular.io/components/table/overview.
Этот ответ вдохновил меня: Вызов renderRows () в таблице материалов Angular
Вы следовали руководству по установке? v5.material.angular.io/guide/getting-started