Угловой 6 мат-стол не сортирует

У меня есть таблица материалов Angular с двумя полями:

<table mat-table [dataSource]="dataSource" matSort  class="mat-elevation-z8">
   <ng-container matColumnDef="Field1">
      <th mat-header-cell *matHeaderCellDef mat-sort-header>Field1</th>
      <td mat-cell *matCellDef="let element"> {{element.Field1}} </td>
   </ng-container>
   <ng-container matColumnDef="Field2">
      <th mat-header-cell *matHeaderCellDef mat-sort-header>Field2</th>
      <td mat-cell *matCellDef="let element"> {{element.Field2}} </td>
   </ng-container>
   <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
   <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

Импортирую следующие модули:

Material.MatTableModule,
Material.MatSortModule,

Затем объявляю сортировку следующим образом:

@ViewChild(MatSort) sort: MatSort;

Я заполняю источник данных из внешнего API, вызывая следующий метод в конструкторе:

       populateTable() {
            this.requestHttpService.getStuff()
                .subscribe(data => {
                        this.results = data;
                        this.dataSource = this.results;
                        this.dataSource.sort = this.sort;
                    },
                    ...

Как вы заметили, я пытаюсь прикрепить sort после загрузки dataSource.

Я также попытался добавить сортировку в ngAfterViewInit () и пару других мест, но независимо от того, что я делаю, это не работает.

Любая идея?


person tom33pr    schedule 01.11.2018    source источник
comment
Вам нужно будет применить setTimeout как setTimeout(() => {this.dataSource.sort = this.sort;});. Пояснение здесь   -  person User3250    schedule 01.11.2018
comment
Просто попробовал все равно без радости.   -  person tom33pr    schedule 01.11.2018
comment
Убедитесь, что ваши свойства matColumnDef соответствуют вашей модели данных. то есть ваши элементы dataSource должны иметь совпадающие свойства. Кроме того, поместите свой matsort в html, например ‹table mat-table [dataSource] = dataSource # sort = matSort matSort class = mat-elevation-z8›   -  person Raj    schedule 01.11.2018
comment
Радж - если он не соответствует коду, выдаст ошибку.   -  person tom33pr    schedule 01.11.2018
comment
Ах! Еще одна вещь, которую вы пропустили, это this.dataSource = new MatTableDataSource(this.results);   -  person User3250    schedule 01.11.2018
comment
Я имел в виду, что отображаемые столбцы должны соответствовать свойствам источника данных.   -  person Raj    schedule 01.11.2018
comment
User3250 - пробовал, что все еще не работает ....   -  person tom33pr    schedule 01.11.2018
comment
какие-либо ошибки в консоли?   -  person User3250    schedule 01.11.2018
comment
В том-то и дело ... ни одной ошибки в консоли. Стол загружается отлично. Оба свойства относятся к строковому типу ... Честно говоря, я заблудился с этим ... Единственная странность, которую я заметил, это то, что сортировка @ViewChild (MatSort): MatSort; MatSort подчеркнут и сообщает мне: Поставляемые параметры не совпадают ... Селектор параметров shpuld имеет тип, присваиваемый (Function \ string), но он имеет тип o MatSort ...   -  person tom33pr    schedule 01.11.2018
comment
Странный! Пожалуйста, опубликуйте весь код компонента после последних изменений.   -  person User3250    schedule 01.11.2018
comment
Вы правильно используете MatSort в ngAfterViewInit?   -  person User3250    schedule 01.11.2018
comment
Могу поблагодарить User3250. Мне удалось заставить его работать. Еще раз спасибо!   -  person tom33pr    schedule 01.11.2018
comment
Круто, ngAfterViewInit и this.dataSource = new MatTableDataSource(this.results); проблему решили? Позвольте мне ответить на вопрос.   -  person User3250    schedule 01.11.2018
comment
Да, плюс ваше первоначальное предложение для setTimeout (() = ›{this.dataSource.sort = this.sort;}); Большое спасибо.   -  person tom33pr    schedule 01.11.2018


Ответы (1)


Вам нужно внести несколько изменений, переместить код в ngAfterViewInit, поскольку MatSort недоступен до ngAfterViewInit и инициализировать источник данных таблицы, как показано ниже:

this.dataSource = new MatTableDataSource(this.results);
person User3250    schedule 01.11.2018