如何解决Angular 12 表头排序未定义
我正在从 Angular 8 升级到 12,但遇到了一些错误。他们中的大多数是固定的。只剩下这个了 The error
此错误意味着 sortChange
未定义。数据显示在表格中。我将此代码用于排序功能:
ngOnInit(): void {
this.currentPageIndex = 0;
this.currentPageSize = this.paginationSettings.defaultPageSize;
this.setDataSource(this.entities);
this.sort.sortChange.subscribe((sort: Sort) => {
debugger;
return this.sortChanged(sort);
});
}
当视图加载时我设置事件 this.sort
ngAfterViewInit() {
this.dataSource.paginator = this.paginator;
this.dataSource.sort = this.sort;
}
变量的值
@ViewChild(MatTable,{ static: true }) table: MatTable<any>;
@ViewChild(MatPaginator) paginator: MatPaginator;
@ContentChild(MatSort,{ static: true }) sort: MatSort;
@ContentChildren(MatHeaderRowDef) headerRowDefs!: QueryList<MatHeaderRowDef>;
@ContentChildren(MatRowDef) rowDefs!: QueryList<MatRowDef<TEntity>>
@ContentChildren(MatColumnDef,{ descendants: true }) columnDefs!: QueryList<MatColumnDef>;
@input() entities: TEntity[]; (the data source)
HTML:
<!-- user component -->
<lq-list
matSort
(settingsChanged)="listSettingsChanged.emit($event)"
[entities]="users"
[isLoading]="isLoading"
[displayedColumns]="displayedColumns"
[paginationSettings]="paginationSettings"
[totalEntityCount]="totalUserCount"
>
<ng-container matColumnDef="email">
<mat-header-cell *matHeaderCellDef mat-sort-header> Email </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.email}} </mat-cell>
</ng-container>
<ng-container matColumnDef="firstName">
<mat-header-cell *matHeaderCellDef mat-sort-header> Voornaam </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.firstName}} </mat-cell>
</ng-container>
<ng-container matColumnDef="lastName">
<mat-header-cell *matHeaderCellDef mat-sort-header> Achternaam </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.lastName}} </mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;" [routerLink]="['/users/',row.id]" class="pointer"></mat-row>
</lq-list>
<!-- the container-->
<mat-table [dataSource]="dataSource">
<ng-content></ng-content>
</mat-table>
<lq-paginator
(page)="paginationSettingsChanged($event)"
[totalEntityCount]="totalEntityCount"
[paginationSettings]="paginationSettings"
></lq-paginator>
ts 表组件
import { Component,Input,EventEmitter,Output,ViewChild,OnInit,AfterViewInit,SimpleChanges,OnChanges } from '@angular/core';
import { User } from '@app/users/models/user';
import { PaginationSettings } from '@app/core/constants/list-pagination-settings';
import { ListSettingsChangedEvent } from '@app/core/models/list-settings-changed-event';
@Component({
selector: 'lq-user-list',templateUrl: './user-list.component.html',styleUrls: ['./user-list.component.scss'],})
export class UsersListComponent {
/**
* The user entities to display
* @type {User[]}
* @memberof UsersListComponent
*/
@input() users: User[];
/**
* Indicator whether the list is loading
* @type {boolean}
* @memberof UsersListComponent
*/
@input() isLoading: boolean;
/**
* Pagination settings
* @type {PaginationSettings}
* @memberof UsersListComponent
*/
@input() paginationSettings: PaginationSettings;
/**
* The total user count
* @type {number}
* @memberof UsersListComponent
*/
@input() totalUserCount: number;
/**
* The event emitter for when the list settings have changed
* @type {EventEmitter<ListSettingsChangedEvent>}
* @memberof UsersListComponent
*/
@Output() listSettingsChanged: EventEmitter<ListSettingsChangedEvent> = new EventEmitter<ListSettingsChangedEvent>();
/**
* The columns to display
* @type {string[]}
* @memberof UsersListComponent
*/
displayedColumns: string[] = ['email','firstName','lastName'];
}
解决方法
@ContentChild(MatSort,{ static: true }) sort: MatSort;
将在内容初始化后设置。
所以 this.sort
在 ngOnInit()
中是未定义的。将其移至 ngAfterContentInit()
。
还需要将 matSort
指令作为投影内容的一部分。
<lq-list
(settingsChanged)="listSettingsChanged.emit($event)"
[entities]="users"
[isLoading]="isLoading"
[displayedColumns]="displayedColumns"
[paginationSettings]="paginationSettings"
[totalEntityCount]="totalUserCount"
>
<ng-container matSort>
<ng-container matColumnDef="email">
<mat-header-cell *matHeaderCellDef mat-sort-header> Email </mat-header-cell>
<mat-cell *matCellDef="let element"> {{element.email}} </mat-cell>
</ng-container>
...
</ng-container>
</lq-list>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。