Элемент управления вкладкой материала Angular 7 со списком

У меня есть последние версии Angular и последняя версия материального компонента для него. Я пытаюсь отобразить таблицу, которая находится внутри Tab Control. Однако я не могу смонтировать операцию сортировки. Пожалуйста помоги. Вот код: Вид:

<div class = "container">
  <div id = "content">
    <div id = "main-content">
      <div>
        <mat-form-field>
          <input matInput placeholder = "Category Name" name = "keyword" [(ngModel)] = "keyword">
        </mat-form-field>
        <mat-checkbox [(ngModel)] = "isActive" name = "isActive">Active only</mat-checkbox>
        <button mat-button type = "button">Search</button>
      </div>
      <mat-tab-group (selectedTabChange) = "onTabChange($event)">
        <mat-tab [label] = "sysCategory.name" *ngFor = "let sysCategory of systemCategories">
          <div>
            <table mat-table matSort matSortDisableClear [dataSource] = "dataSource?.items" class = "mat-elevation-z4">
              <tr>
                <ng-container matColumnDef = "name">
                  <th mat-header-cell *matHeaderCellDef mat-sort-header>Category</th>
                  <td mat-cell *matCellDef = "let element">
                    <mat-form-field *ngIf = "element.inEditMode">
                      <input matInput placeholder = "Category" required maxlength = "255" [(ngModel)] = "element.name" />
                    </mat-form-field>
                    <span *ngIf = "!element.inEditMode">{{element.name}}</span>
                  </td>
                </ng-container>
              </tr>
              <tr mat-header-row *matHeaderRowDef = "displayedColumns"></tr>
              <tr mat-row *matRowDef = "let row; columns: displayedColumns;"></tr>
            </table>
          </div>
        </mat-tab>
      </mat-tab-group>
    </div>
  </div>
</div>

Компонент:

export class CategoriesListComponent implements OnInit, AfterViewInit {
  displayedColumns: string[] = ['name', 'delete', 'edit'];
  dataSource: ResultsList<CategoryModel>;

  systemCategories: SystemCategoryModel[];
  sysCategoryId: number;
  isActive = true;
  keyword: '';

  @ViewChild(MatSort) sort: MatSort = new MatSort();

  constructor(private systemCategoriesService: DictionaryService, private categoriesService: CategoriesService) { }

  ngOnInit() {
    this.systemCategoriesService.getDictionary<SystemCategoryModel>(SystemCategoriesUrl)
      .subscribe(v => { this.systemCategories = v; });
  }

  ngAfterViewInit() {
    // S.O.S it doesnt work here for sure!
    // this.sort.sortChange.subscribe(() => this.loadGrid());
  }

  onTabChange(tabChangeEvent: MatTabChangeEvent) {
    this.sysCategoryId = this.systemCategories[tabChangeEvent.index].id;
    this.loadGrid();
  }

  loadGrid() {
    const query = this.createQuery();
    this.categoriesService.load(query).subscribe(v => this.dataSource = v);
  }

  private createQuery(): CategoriesSearchQuery {
    return {
      isActive: this.isActive,
      keyword: this.keyword,
      pageIndex: 0,
      pageSize: 1000,
      sortField: this.sort && this.sort.active || 'name',
      isDesc: this.sort && this.sort.direction === 'desc' || false,
      systemCategoryId: this.sysCategoryId
    };
  }

Может быть так: this.dataSource.sort= this.sort после назначения списка данных источнику данных

Prashant Pimpale 29.01.2019 07:42

@PrashantPimpale, да, конечно. Но... Как добавить его раньше?

alerya 29.01.2019 07:43

Можете ли вы предоставить StackBlitz?

Prashant Pimpale 29.01.2019 07:45

Я попробую, но кажется, что это проблематично. Нужно потратить 1-2-3 часа, чтобы все там смонтировать.

alerya 29.01.2019 07:53
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
4
1 634
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Измените этот @ViewChild(MatSort) sort: MatSort = new MatSort(); на просто @ViewChild(MatSort) sort: MatSort;.

Кроме того, вам необходимо назначить MatSort источнику данных следующим образом: this.dataSource.sort = this.sort;, обычно это делается в файле ngOnInit().

For more information check out the official Angular Material examples, there is an example for a table with filtering that should cover your needs.

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

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

Увы. Это не работает. Как видите, сначала я обновляю вкладки, а затем onTabChange обновляю тело вкладки.

alerya 29.01.2019 07:56

Пожалуйста. Не посылайте меня к угловым примерам. Я был там. Вот почему я пишу здесь, в StackOverflow.

alerya 29.01.2019 08:00

да и дополнительно. Ни this.dataSource.sort, ни this.dataSource.items.sort не имеют свойства sort,

alerya 29.01.2019 08:03

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

Fabian Küng 29.01.2019 08:04

Да, кажется, ваш пример - решение. Попробую чуть позже и конечно же сообщу. Спасибо, Фабиан.

alerya 29.01.2019 08:50

Конечно, это может быть не лучшим решением, но оно должно дать вам представление о том, с чего начать решение вашей проблемы. Пожалуйста, обновите информацию о том, как вы ее решили.

Fabian Küng 29.01.2019 08:53

Другие вопросы по теме