
本教程深入探讨了在 angular 应用中,如何正确地为 material table 处理异步数据加载。我们将分析常见的初始化问题,并提供一个可靠的解决方案,确保 `mattabledatasource` 在数据可用后被正确实例化,从而避免表格无法渲染数据的困境,实现数据的平滑展示与交互功能。
在 Angular 应用中,使用 Material Table ( mat-table ) 展示数据是一种常见且强大的模式。然而,当数据需要从后端服务异步获取时,开发者经常会遇到一个挑战:表格无法正确显示数据,或者显示为空。这通常是由于 MatTableDataSource 在数据实际加载完成之前就被错误地初始化了。
Angular 中的 HTTP 请求(例如使用 HttpClient 或通过 Swagger/OpenAPI 生成的服务)是异步操作。这意味着当组件的构造函数执行时,通过服务发起的网络请求可能尚未返回结果。如果此时尝试使用一个尚未填充数据的变量来初始化 MatTableDataSource,表格将呈现为空,因为 dataSource 接收到的是一个 undefined 或空数组。
原始代码分析
在提供的原始代码片段中,问题出现在以下部分:
ChatCut
AI视频剪辑工具
1086
查看详情
export class NewsComponent implements OnInit {
news_list: any; // 数据变量
// ... 其他属性
newsListService = this.newsService.v1Nobina2NewsesGet().subscribe(
(res) => {
this.news_list = res; // 异步回调中赋值
},
// ... 错误处理
);
constructor(private newsService: Nobina2NewsesService) {
// PROBLEM: 在构造函数中,news_list 很可能还未被赋值
this.dataSource = new MatTableDataSource(this.news_list);
}
ngOnInit(): void {
throw new Error('Method not implemented.'); // 此处也未进行有效的数据加载
}
// ... 其他方法
}上述代码的问题在于,this.newsListService 的订阅回调是异步执行的,而 constructor 会立即执行。因此,当 this.dataSource = new MatTableDataSource(this.news_list); 这行代码执行时,this.news_list 变量很可能仍是 undefined 或一个空值,导致 MatTableDataSource 被一个空数据集初始化。
解决此问题的核心在于确保 MatTableDataSource 仅在异步数据成功加载并赋值给相应变量后才被实例化。我们可以通过以下步骤实现:
我们将修改 NewsComponent 的 TypeScript 代码,将数据获取和 dataSource 的初始化分离开来。
import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core';
import { Nobina2NewsesService, StopInfoApiApplicationQueriesNobina2NewsesNobina2NewsResponse } from '../../services/mssql/stop/api/v1';
import { MatPaginator } from '@angular/material/paginator';
import { MatSort } from '@angular/material/sort';
import { MatTableDataSource } from '@angular/material/table';
@Component({
selector: 'app-news',
templateUrl: './news.component.html',
styleUrls: ['./news.component.css']
})
export class NewsComponent implements OnInit, AfterViewInit {
// 建议初始化为空数组,并明确类型
news_list: StopInfoApiApplicationQueriesNobina2NewsesNobina2NewsResponse[] = [];
displayedColumns: string[] = ['id', 'title', 'date', 'text'];
// 明确 dataSource 的类型
dataSource: MatTableDataSource<StopInfoApiApplicationQueriesNobina2NewsesNobina2NewsResponse>;
@ViewChild(MatPaginator) paginator!: MatPaginator;
@ViewChild(MatSort) sort!: MatSort;
constructor(private newsService: Nobina2NewsesService) {
// 构造函数中仅进行依赖注入,并初始化一个空的 MatTableDataSource 实例
// 这样可以确保 dataSource 始终是一个有效的 MatTableDataSource 对象,避免 null/undefined 错误
this.dataSource = new MatTableDataSource<StopInfoApiApplicationQueriesNobina2NewsesNobina2NewsResponse>([]
);
}
ngOnInit(): void {
// 在 ngOnInit 生命周期钩子中调用数据获取方法
this.getData();
}
ngAfterViewInit() {
// 在这里设置分页器和排序器到当前的 dataSource 实例
// 注意:如果 dataSource 实例在 setDataSource() 中被替换,这些绑定需要重新应用
this.dataSource.paginator = this.paginator;
this.dataSource.sort = this.sort;
}
/**
* 获取新闻列表数据
*/
getData(): void {
this.newsService.v1Nobina2NewsesGet().subscribe(
(res: StopInfoApiApplicationQueriesNobina2NewsesNobina2NewsResponse[]) => {
this.news_list = res; // 数据成功获取后赋值给 news_list
this.setDataSource(); // 然后调用方法设置 dataSource
},
(err) => {
console.error('获取新闻数据失败:', err);
alert("Kolla nätverksanslutnignen(CORS)"); // 错误处理
}
// complete 回调可以根据需要添加
);
}
/**
* 设置 MatTableDataSource
*/
setDataSource(): void {
// 使用已获取的数据创建新的 MatTableDataSource 实例
this.以上就是Angular Material Table 数据源异步加载与显示最佳实践的详细内容,更多请关注其它相关文章!
相关文章:
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法
印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
微信聊天记录怎么加密_微信聊天记录加密方法
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
自动化J*a应用中GitHub CLI或REST API的认证与交互
Go语言中构建可靠数据存储的原子性与持久化策略
sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程
汽水音乐网页版使用入口_汽水音乐电脑版播放指南
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
提升Kafka消费者健壮性:会话超时处理与消息处理语义
晋江读书网页版在线登录 晋江读书电脑版官网
菜鸟取件码是什么怎么查 最全查询渠道汇总
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
Lar*el Form Request 中唯一性验证更新操作的正确实践
Excel Power Pivot如何处理XML数据源 构建高级数据模型
c++20的std::jthread是什么_c++可中断线程与RAII式管理
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
J*aScript中如何高效提取对象指定属性
C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用
12306怎么选座位选到安静区_12306选座安静区域选择策略
Node.js中HTML按钮与J*aScript函数交互的正确姿势
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
在命令行怎么运行html项目_命令行运行html项目方法【教程】
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
html5 app怎么运行环境_配html5 app运行环境【教程】
AO3同人作品网入口 AO3搜索引擎官网永久地址
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符
12306选座怎么选到商务座_12306商务座选择与配置说明
快手官方唯一登录入口 谨防山寨钓鱼网站
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧
qq游戏跨平台入口_qq游戏多设备同步登录
小米汽车11月交付量突破40000台!雷军:将继续努力
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
Python多版本共存与虚拟环境管理深度指南
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
在J*a中如何使用ForkJoinPool进行分治任务并行处理_ForkJoinPool分治并行技巧说明
抖音怎么赚钱_抖音创作者变现方法与途径指南
抖音网页版平台入口 抖音网页版官网在线访问教程
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
Pandas DataFrame:高效添加条件计算列