

新闻资讯
技术学院在 angular material 表格中,使用单一布尔变量控制所有复选框会导致状态混乱;正确做法是为每行维护独立的选中状态,并结合分页数据源,确保“全选”仅作用于当前页可见行。
要实现在分页表格中点击表头“全选”复选框时,仅选中当前页显示的行(而非全部 1000 条数据
),关键在于:避免共享 checked 状态变量,并动态获取当前页的数据子集。
建议使用 Map
// 在组件类中定义 selectedState = new Map(); // card.Id → 是否选中 // 初始化:首次加载时可设默认为 false(可选) ngOnInit() { this.dataSource.paginator = this.paginator; this.cards.forEach(card => this.selectedState.set(card.Id, false)); }
Επιλογή Κάρτας
// 获取当前页显示的卡片(需配合 MatPaginator)
getCurrentPageData(): CardModule.Card[] {
const startIndex = this.paginator.pageIndex * this.paginator.pageSize;
return this.cards.slice(startIndex, startIndex + this.paginator.pageSize);
}
// 判断当前页是否全选
isAllCurrentPageSelected(): boolean {
const currentPage = this.getCurrentPageData();
return currentPage.length > 0 &&
currentPage.every(card => this.selectedState.get(card.Id) === true);
}
// 判断当前页是否部分选中(用于 indeterminate 状态)
isSomeCurrentPageSelected(): boolean {
const currentPage = this.getCurrentPageData();
return currentPage.some(card => this.selectedState.get(card.Id) === true);
}
// 全选/取消全选当前页
toggleSelectAllCurrentPage(checked: boolean): void {
const currentPage = this.getCurrentPageData();
currentPage.forEach(card => this.selectedState.set(card.Id, checked));
this.updateSelectedCardsList();
}
// 单行切换
toggleRowSelection(card: CardModule.Card): void {
const currentState = this.selectedState.get(card.Id) ?? false;
this.selectedState.set(card.Id, !currentState);
this.updateSelectedCardsList();
}
// 同步更新 selectedCards(提交用)
private updateSelectedCardsList(): void {
this.selectedCards = Array.from(this.selectedState.entries())
.filter(([_, isSelected]) => isSelected)
.map(([id, _]) => id.toString());
}通过解耦 UI 状态与业务数据、显式管理分页上下文,即可稳健实现符合用户体验与工程规范的“当前页全选”功能。