У меня есть последние версии 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
};
}
@PrashantPimpale, да, конечно. Но... Как добавить его раньше?
Можете ли вы предоставить StackBlitz?
Я попробую, но кажется, что это проблематично. Нужно потратить 1-2-3 часа, чтобы все там смонтировать.





Измените этот @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 обновляю тело вкладки.
Пожалуйста. Не посылайте меня к угловым примерам. Я был там. Вот почему я пишу здесь, в StackOverflow.
да и дополнительно. Ни this.dataSource.sort, ни this.dataSource.items.sort не имеют свойства sort,
Это связано с тем, что вы не используете MatTableDataSource, как описано в документации Angular Material. Может быть, еще раз взглянуть на документацию, MatTableDataSource.
Да, кажется, ваш пример - решение. Попробую чуть позже и конечно же сообщу. Спасибо, Фабиан.
Конечно, это может быть не лучшим решением, но оно должно дать вам представление о том, с чего начать решение вашей проблемы. Пожалуйста, обновите информацию о том, как вы ее решили.
Может быть так:
this.dataSource.sort= this.sortпосле назначения списка данных источнику данных