Изменение свойства paginator pageSize не обновляет таблицу

#angular #angular-material #mat-table

Вопрос:

Я новичок в веб-разработке (угловой). Я пытаюсь привязать mat-select опцию отображения записей к mat-paginator с помощью следующего:

HTML:

  <div class="col">
    <span class="">Display</span>
    <mat-form-field id="display-record-count" appearance="outline" class="mx-2">
      <mat-select [(value)]="displayRecordCount">
        <mat-option value="5">5</mat-option>
        <mat-option value="10">10</mat-option>
        <mat-option value="20">20</mat-option>
      </mat-select>
    </mat-form-field>
    <span class="">records</span>
  </div>


<mat-paginator #paginator [pageSize]="displayRecordCount" [pageSizeOptions]="[5, 10, 20]">
  </mat-paginator>
 

тс:

 displayRecordCount="10";
 

Это работает не так, как можно было бы ожидать. Он обновляет элемент на странице, но не обновляет таблицу мата.Я не уверен, чего мне не хватает. Кто-нибудь может мне помочь? Я попробовал следующее:

  this.dataSource.paginator._changePageSize( this.displayRecordCount);
 

введите описание изображения здесь

Смотрите код в
Stackblitz
.

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

1. Я бы изменил название вопроса на Changing paginator pageSize property doesn't refresh the table

Ответ №1:

Просто выберите событие изменения для выпадающего списка, как показано ниже.

 <mat-select (selectionChange)="this.paginator._changePageSize($event.value)">
...
</mat-select>
 

И больше не требуется привязывать value to displayRecordCount variable .

Проверьте этот стекблитц

Ответ №2:

Очевидно, что пагинатор не заставляет источник данных обновляться, просто изменяя его pageSize свойство, и paginator._changePageSize требуется вызов. Вероятно, вы делаете это не в том месте.

Добавьте установщик в свою декларацию свойств, чтобы вручную запустить обновление, таким образом:

   _displayRecordCount = '10';

  get displayRecordCount() {
    return this._displayRecordCount;
  }
  set displayRecordCount(value) {
    this._displayRecordCount = value;
    this.paginator._changePageSize( value);
  }
 

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

1. У меня это не сработало. Не знаю почему. может быть, это потому, что мой пейджинатор определен следующим ngOnInit образом setTimeout(() => this.dataSource.sort = this.sort);

2. Если вы внесете это изменение в свой stackblitz, это сработает. Не уверен, как выглядит ваш реальный код.