Угловая сортировка таблицы материалов - данные не сортируются, когда они находятся внутри условия *ngIf

У меня есть таблица угловых материалов. Когда я окружаю HTML для таблицы с <div *ngIf="true"> таблица отображается, но данные больше не сортируются при нажатии на столбец заголовка.

Взять пример из: https://material.angular.io/components/table/overview

И изменив его, просто добавив <div *ngIf="true"> ... </div> демонстрирует это поведение. Пример находится по адресу: https://stackblitz.com/edit/angular-quzvjv

2 ответа

База на решении Угловая 5 Сортировка таблицы данных материала не работает

В Angular 8, @ViewChild декоратору нужен второй аргумент {static: true|false}

Для того, чтобы поймать MatSort компонент после рендеринга DOM, установите {static:false}:

export class TableSortingExample{

    sort;
    @ViewChild(MatSort, {static: false}) set content(content: ElementRef) {
        this.sort = content;
        if (this.sort){
           this.dataSource.sort = this.sort;
        }
    }
}

Когда установлено {static : true}Angular Compiler учитывает это @ViewChild элемент является статическим, поэтому он получает элемент только один раз в ngOnInit(), Даже если *ngIf срабатывает до сих пор не могу поймать MatSort составная часть.

См. /questions/48447100/kak-mne-ispolzovat-novuyu-staticheskuyu-optsiyu-dlya-viewchild-v-angular-8/48447114#48447114 от @PierreDuc

У консоли войти в систему ngOnInit из this.sort

Угловой не поймал MatSort компонент на этапе инициализации NgIf не обработал шаблон.

+ Изменить ngOnInit в ngAfterViewInit и это будет работать, как ожидалось.

Спасибо, Данил, ваше предложение сработало, но только когда *ngIf оценивается как true, когда представление инициализируется.

Решение, которое я сейчас использую:

@ViewChild(MatSort) set content(sort: MatSort) {
    this.dataSource.sort = sort;
}

Это основано на информации из: Angular 2 @ViewChild в *ngIf

Полное рабочее решение по адресу: https://stackblitz.com/edit/angular-quzvjv-jzdbb6

В Angular 8 мы можем легко добиться сортировки нескольких / единственных таблиц материалов и разбиения на страницы внутри *ngIf. В приведенном ниже примере я использую "ng-template", чтобы показать / скрыть таблицу с помощью *ngIf else.

Мой образец формата *ngIf

   <div *ngIf="!isDataLoadedFromApi; else loadTransactions">No data to display</div>

Ниже таблицы в таком же виде

Таблица 1

<ng-template #loadCases>
<table mat-table [dataSource]="snowDataSource" #snowSort="matSort" matSort class="mat-elevation-z3 snow-table">
    <mat-paginator class="mat-elevation-z3" #snowPaginator [pageSizeOptions]="[3, 10, 20]" showFirstLastButtons>
    </mat-paginator></ng-template>

Таблица 2

<ng-template #loadTransactions>
<table mat-table [dataSource]="transactionDataSource" #transactionSort="matSort" matSort
    class="mat-elevation-z3 transaction-table">
    <mat-paginator class="mat-elevation-z3" #transactionPaginator [pageSizeOptions]="[3, 10, 20]"
        showFirstLastButtons>
    </mat-paginator></ng-template>

Проверьте "#transactionSort="matSort"и #transactionPaginator в таблице 2. Также"#snowSort="matSort" и #snowPaginator в таблице 1

В файле TS настройте вид ребенка и другие параметры, как показано ниже. Вот и все.

@ViewChild('snowSort', { static: false }) set matSnowSort(snowSort: MatSort) {
this.snowSort = snowSort;
if (this.snowDataSource !== null && this.snowDataSource !== undefined) {
    this.snowDataSource.sort = this.snowSort;
}}

@ViewChild('snowPaginator', { static: false }) set matSnowPaginator(snowPaginator: MatPaginator) {
this.snowPaginator = snowPaginator;
if (this.snowDataSource !== null && this.snowDataSource !== undefined) {
    this.snowDataSource.paginator = this.snowPaginator;
}}

@ViewChild('transactionSort', { static: false }) set matTransactionSort(transactionSort: MatSort) {
this.transactionSort = transactionSort;
if (this.transactionDataSource !== null && this.transactionDataSource !== undefined) {
    this.transactionDataSource.sort = this.transactionSort;
}}

@ViewChild('transactionPaginator', { static: false }) set matTransactionPaginator(transactionPaginator: MatPaginator) {
this.transactionPaginator = transactionPaginator;
if (this.transactionDataSource !== null && this.transactionDataSource !== undefined) {
    this.transactionDataSource.paginator = this.transactionPaginator;
}}

private transactionSort: MatSort;
private transactionPaginator: MatPaginator;
private snowSort: MatSort;
private snowPaginator: MatPaginator;
payIdTransactions: TLItem[];
snowCases: Cases[];
transactionDataSource: MatTableDataSource<TLItem>;
snowDataSource: MatTableDataSource<Cases>;

private getTransactions(startDate: string, endDate: string) {
    this.payIdTransactions = results.getTransactionsResponse.TLItems.TLItem;
    this.transactionDataSource = new MatTableDataSource(this.payIdTransactions);
}
private getSnowCases(startDate: string, endDate: string) {
    this.snowCases = results.getCasesResponse.cases;
    this.snowDataSource = new MatTableDataSource(this.snowCases);
}
Другие вопросы по тегам