Пагинатор мата настольного неработающего - PullRequest
0 голосов
/ 06 июля 2019

Я новичок в angular и машинописи и пытаюсь создать таблицу с нумератором страниц. Набор данных paginator происходит из API REST. API работает до сих пор, и я успешно получаю данные.

К сожалению, в настоящее время пагинатор не работает.

Импорт в порядке. Я назначаю данные после того, как получаю данные из моей службы REST, но все равно я получаю это сообщение об ошибке:

ERROR TypeError: Cannot set property 'paginator' of undefined

Что я делаю не так?

 availableLanguages: ILanguage[];
  displayedColumns = ['language'];
  dataSource: MatTableDataSource<ILanguage>;

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

  constructor(public service: DialectService) {}

  ngOnInit(): void {
    this.service.getLanguages()
      .subscribe((resp: ILanguage[]) => {
        this.availableLanguages = resp;
        this.dataSource = new MatTableDataSource(resp);
      });
  }


  /**
   * Set the paginator and sort after the view init since this component will
   * be able to query its view for the initialized paginator and sort.
   */
  ngAfterViewInit() {
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.sort;
  }



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

<!--   -->
<div class="example-header">
  <mat-form-field>
    <input matInput (keyup)="applyFilter($event.target.value)" placeholder="Filter">
  </mat-form-field>
</div>

<div class="example-container mat-elevation-z8">

  <mat-table [dataSource]="dataSource" matSort>

    <ng-container matColumnDef="language">
      <mat-header-cell *matHeaderCellDef mat-sort-header> Language </mat-header-cell>
      <mat-cell *matCellDef="let row"> {{row}} </mat-cell>
    </ng-container>


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

  <mat-paginator [pageSizeOptions]="[1, 2, 25, 100]"></mat-paginator>
</div>

1 Ответ

0 голосов
/ 07 июля 2019

Попробуйте переместить весь код инициализации вашего набора данных в ngAfterViewInit. Как ниже.

availableLanguages: ILanguage[];
displayedColumns = ['language'];
dataSource: MatTableDataSource<ILanguage>;

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

constructor(public service: DialectService) {}

ngOnInit(): void { }

ngAfterViewInit() {
    this.service.getLanguages()
        .subscribe((resp: ILanguage[]) => {
            this.availableLanguages = resp;
            this.dataSource = new MatTableDataSource(resp);
            this.dataSource.paginator = this.paginator;
            this.dataSource.sort = this.sort;
        });
}

Поскольку вызов this.service.getLanguages() является асинхронным, он не был завершен к моменту запуска ловушки жизненного цикла ngAfterViewInit. Таким образом, когда ngAfterViewInit пытался присвоить paginator this.dataSource, он все еще не был определен.

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