Таблица углов угловой 6 не показывает никаких данных, несмотря на наличие источника данных - PullRequest
0 голосов
/ 04 июня 2018

Я хочу показать список через mat-table таблицы данных Angular Material Design.Вот мой компонент:

import { LeaveapplicationService } from './../../services/leaveapplication.service';
import { leaveapplication } from './../../models/leaveapplication';
import { Component, OnInit, ViewChild, Input } from '@angular/core';
import { MatTableDataSource, MatPaginator, MatSort } from '@angular/material';
// import { DataSource } from '@angular/cdk/table';

@Component({
  selector: 'app-leaveapplication-list',
  templateUrl: './leaveapplication-list.component.html',
  styleUrls: ['./leaveapplication-list.component.scss']
})
export class LeaveapplicationListComponent implements OnInit {
  leaveApplications: leaveapplication[];
  displayedColumns: ['id', 'applicant', 'manager', 'leavetype', 'start', 'end', 'return', 'status'];
  dataSource: MatTableDataSource<leaveapplication>;

  constructor(private leaveApplicationService: LeaveapplicationService) { }

  @ViewChild(MatPaginator) paginator: MatPaginator;
  @ViewChild(MatSort) sort: MatSort;

  ngOnInit() {
    this.leaveApplicationService.getLeaveApplications().subscribe(leaveapplications => {
      this.leaveApplications = leaveapplications;
      this.dataSource = new MatTableDataSource<leaveapplication>(this.leaveApplications);
      this.dataSource.paginator = this.paginator;
      this.dataSource.sort = this.sort;
      console.log(this.dataSource);
    });

  }

  applyFilter(filterValue: string) {
    filterValue = filterValue.trim(); // Remove whitespace
    filterValue = filterValue.toLowerCase(); // MatTableDataSource defaults to lowercase matches
    this.dataSource.filter = filterValue;
  }
}

Интерфейс отпуска приложения:

export interface leaveapplication {
  id: number; 
  applicant: string;
  manager: string;
  startdate: Date;
  enddate: Date;
  returndate: Date;
  leavetype: string; 
  status: string;
}

Я правильно получаю источник данных в консоли:

enter image description here

Но таблицы матов возвращают пустые ячейки:

enter image description here

Вот мой шаблон:

<mat-form-field>
  <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
</mat-form-field>
<mat-table #table [dataSource]="dataSource" matSort class="mat-elevation-z8">
  <ng-container matColumnDef="id">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Form ID </th>
    <td mat-cell *matCellDef="let leaveapplication"> {{leaveapplication.id}} </td>
  </ng-container>
  <ng-container matColumnDef="applicant">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Applicant </th>
    <td mat-cell *matCellDef="let leaveapplication"> {{leaveapplication.applicant}} </td>
  </ng-container>

  <ng-container matColumnDef="manager">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Manager </th>
    <td mat-cell *matCellDef="let leaveapplication"> {{leaveapplication.manager}} </td>
  </ng-container>

  <ng-container matColumnDef="leavetype">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Leave Type </th>
    <td mat-cell *matCellDef="let leaveapplication"> {{leaveapplication.leaveType}} </td>
  </ng-container>
  <ng-container matColumnDef="start">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Start Date </th>
    <td mat-cell *matCellDef="let leaveapplication"> {{leaveapplication.startDate | date:'dd-MM-yyyy'}} </td>
  </ng-container>
  <ng-container matColumnDef="end">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> End Date </th>
    <td mat-cell *matCellDef="let leaveapplication"> {{leaveapplication.endDate | date:'dd-MM-yyyy'}} </td>
  </ng-container>
  <ng-container matColumnDef="return">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Return Date </th>
    <td mat-cell *matCellDef="let leaveapplication"> {{leaveapplication.returnDate | date:'dd-MM-yyyy'}} </td>
  </ng-container>
  <ng-container matColumnDef="status">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Status </th>
    <td mat-cell *matCellDef="let leaveapplication"> {{leaveapplication.status}} </td>
  </ng-container>
  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</mat-table>

<mat-paginator [pageSizeOptions]="[5, 10, 20]" showFirstLastButtons></mat-paginator>

Почему я не получаю заполненный столик?Это из-за асинхронного характера ответа?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

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

Я создал массив Mock-Data в своем сервисе и передалэто вместо результата, который я получаю из своей базы данных.С Mock-Array это сработало, и я заполнил данные в моей таблице матов.

После того, как я зарегистрировал в базе данных результат и базу данных и Mock-Data, в консоли я заметил, что получаю объектс массивом из моей базы данных вместо просто массива.

Консоль браузера ->

MOCK-DATA: [{...}]

БАЗА ДАННЫХ: {[{...}]}

Если вы посмотрите внимательно, вы можете увидеть в DOM вашего браузера, источник данных установлен на [Object object], и я думаю, что есть проблема, потому что Mat-Table может 'т доступ к данным.

Я нашел обходной путь, где я передаю массив объекта вместо объекта, который немного грязный, но выполняет работу, пока не найду корень проблемы.

Вот мой сервис:

rfc.service.ts

@Injectable({
  providedIn: 'root'
})
export class RfcService {
  rfcsChanged = new Subject<Rfc[]>();
  private dbSubs: Subscription[] = [];

  <<MOCK-DATA>>

  constructor(private http: HttpClient) { }

  httpOptions = {
    headers: new HttpHeaders({
      'Content-Type': 'application/json'
    })
  };

  fetchRfcs() {...}

  cancelSubscriptions() {
    this.dbSubs.forEach(sub => sub.unsubscribe());
  }

После того, как я изменил свой код с:

fetchRfcs() {
  this.dbSubs.push(
    this.http.get<Rfc[]>('http://localhost:3000/rfcs')
     .subscribe((rfcs: Rfc[]) => {
       // console.log(this.MOCK_RFCS);
       // console.log(rfcs);
       this.rfcsChanged.next(rfcs); 
     })
  );
}

на:

fetchRfcs() {
  this.dbSubs.push(
    this.http.get<Rfc[]>('http://localhost:3000/rfcs')
     .subscribe((rfcs: Rfc[]) => {
        // console.log(this.MOCK_RFCS);
        // console.log(rfcs.rfcs);
        this.rfcsChanged.next(rfcs.rfcs); 
     })
    );
}

это сработало.

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

Как вы извлекаете данные в своем сервисе?

0 голосов
/ 27 июля 2018

В ng-контейнере вышеуказанного HTML-кода измените, как показано ниже.

From matColumnDef="start" to matColumnDef="startDate" From matColumnDef="end" to matColumnDef="endDate " From matColumnDef="return" to matColumnDef="returnDate"

matColumnDef должен точно соответствовать столбцу данных, в противном случаеданные не будут отображаться в таблице матов.

0 голосов
/ 04 июня 2018

Попробуйте проверить, установлено ли this.leaveApplications.

ngOnInit() {
this.leaveApplicationService.getLeaveApplications().subscribe(leaveapplications => {
  this.leaveApplications = leaveapplications;
  if (this.leaveApplications) {
     this.dataSource = new MatTableDataSource<leaveapplication>(this.leaveApplications);
      this.dataSource.paginator = this.paginator;
      this.dataSource.sort = this.sort;
      console.log(this.dataSource);
  }
 });
}
...