如何正确地将异步数据绑定到 Angular Material Table

如何正确地将异步数据绑定到 Angular Material Table

本文详细阐述了在 angular 应用中,如何高效且正确地将异步获取的数据绑定到 `mattabledatasource`。我们将探讨常见的异步数据绑定陷阱,并提供一个推荐的解决方案,确保数据在加载完成后能顺利渲染到 angular material 表格中,同时涵盖分页、排序和过滤的配置。

1. Angular Material Table 数据源 (MatTableDataSource) 概述

MatTableDataSource 是 Angular Material 表格组件的核心,它负责管理表格的数据、提供过滤、排序和分页等功能。要使 mat-table 正常工作,必须为其 [dataSource] 属性提供一个 MatTableDataSource 实例,并将实际数据传递给该实例。

一个典型的 MatTableDataSource 初始化示例如下:

import { MatTableDataSource } from '@angular/material/table';// ... 在组件类中dataSource: MatTableDataSource;// ... 在某个方法中this.dataSource = new MatTableDataSource(yourDataArray);

2. 异步数据绑定常见陷阱

在 Angular 应用中,数据通常通过 HTTP 请求从后端异步获取。一个常见的错误是在组件的 constructor 中尝试将异步获取的数据直接赋值给 MatTableDataSource。这是因为 constructor 在组件实例化时同步执行,而 HTTP 请求是异步的,其数据返回需要时间。

考虑以下导致表格无法显示数据的错误模式:

export class NewsComponent implements OnInit {  news_list: any; // 存储异步获取的数据  dataSource: MatTableDataSource;  // 异步数据获取订阅,但其回调会在未来执行  newsListService = this.newsService.v1Nobina2NewsesGet().subscribe(    (res) => {      this.news_list = res; // 数据在此处被赋值    },    (err) => { console.log(err); alert("Kolla nätverksanslutnignen(CORS)"); }  );  constructor(private newsService: Nobina2NewsesService) {    // 此时 news_list 很可能尚未被异步数据填充,仍然是 undefined 或空    this.dataSource = new MatTableDataSource(this.news_list);  }  // ...}

问题分析:在 constructor 执行时,this.newsListService 的订阅虽然已经开始,但 v1Nobina2NewsesGet() 是一个异步操作。这意味着 (res) => { this.news_list = res; } 回调函数会在未来某个时间点执行,而不是在 constructor 执行时立即执行。因此,当 this.dataSource = new MatTableDataSource(this.news_list); 语句执行时,this.news_list 仍然是 undefined 或空值,导致 MatTableDataSource 被一个空或无效的数据初始化,表格自然无法渲染数据。

3. 正确的异步数据绑定策略

为了确保 MatTableDataSource 在数据可用时才被初始化或更新,我们应该在异步数据请求成功的回调中进行赋值操作。推荐的方法是利用 Angular 的生命周期钩子 ngOnInit 来触发数据加载,并在数据返回后更新 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 {  // 初始化为空数组,确保 dataSource 始终有一个有效的数据结构  news_list: StopInfoApiApplicationQueriesNobina2NewsesNobina2NewsResponse[] = [];  displayedColumns: string[] = ['id', 'title', 'date', 'text'];  dataSource: MatTableDataSource;  @ViewChild(MatPaginator) paginator!: MatPaginator;  @ViewChild(MatSort) sort!: MatSort;  constructor(private newsService: Nobina2NewsesService) {    // 在构造函数中初始化 dataSource,传入空数组,等待数据加载    this.dataSource = new MatTableDataSource(this.news_list);  }  ngOnInit(): void {    this.getData(); // 在组件初始化后开始获取数据  }  ngAfterViewInit(): void {    // 确保 paginator 和 sort 在视图初始化后可用,并赋值给 dataSource    this.dataSource.paginator = this.paginator;    this.dataSource.sort = this.sort;  }  /**   * 获取新闻列表数据   */  getData(): void {    this.newsService.v1Nobina2NewsesGet().subscribe(      (res: StopInfoApiApplicationQueriesNobina2NewsesNobina2NewsResponse[]) => {        this.news_list = res;        this.setDataSource(); // 数据获取成功后,设置数据源      },      (err) => {        console.error('获取新闻数据失败:', err);        alert("Kolla nätverksanslutnignen(CORS)"); // 提示用户网络连接或CORS问题      }    );  }  /**   * 设置 MatTableDataSource 的数据   */  setDataSource(): void {    // 直接更新 dataSource 的 data 属性,这将触发表格刷新    this.dataSource.data = this.news_list;    // 如果 paginator 已经设置,确保在数据更新后重置到第一页    if (this.dataSource.paginator) {      this.dataSource.paginator.firstPage();    }  }  /**   * 应用过滤器   * @param event 输入事件   */  applyFilter(event: Event): void {    const filterValue = (event.target as HTMLInputElement).value;    this.dataSource.filter = filterValue.trim().toLowerCase();    // 过滤后回到第一页,提升用户体验    if (this.dataSource.paginator) {      this.dataSource.paginator.firstPage();    }  }}

HTML 模板 (app-news.component.html):

  筛选  
ID {{ news.id }} 标题 {{ news.title }} 日期 {{ news.date?.split('T')[0] }} 内容 {{ news.text }}
没有匹配 "{{input.value}}" 的数据

4. 关键注意事项

异步操作的时序性: 始终记住 HTTP 请求是异步的。任何依赖于这些请求返回数据的操作(如更新 dataSource)都必须在订阅

以上就是如何正确地将异步数据绑定到 Angular Material Table的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1593591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
html语言如何排版_HTML语言(语义化标签)内容排版规范方法
上一篇 2025年12月23日 08:42:13
优化手风琴(Accordion)组件:实现单项展开功能
下一篇 2025年12月23日 08:42:24

相关推荐

  • 如何设置虚拟内存_电脑虚拟内存最佳设置方法

    虚拟内存是硬盘上用于扩展物理内存的备用空间,当ram不足时系统将不常用数据移至虚拟内存以防止崩溃并优化性能;2. 大多数用户应让windows自动管理虚拟内存,系统会根据使用情况动态调整;3. 手动设置适用于内存小于8gb、运行大型程序卡顿、拥有多个硬盘或追求固定大小减少碎片的场景;4. 初始大小建…

    2026年8月26日
    100
  • 怎样在VSCode中快速缩进代码?

    使用Tab键向右缩进,Shift+Tab向左反缩进,光标所在行或选中行均可生效;2. 通过设置调整“Tab Size”和“Insert Spaces”以统一缩进风格;3. 利用Shift+Alt+F格式化代码,并启用“Format On Save”实现保存时自动缩进,提升编码效率。 在VSCode中…

    2026年8月26日
    000
  • 微信公众号怎么设置_微信公众号基础设置与菜单配置教程

    答案:微信公众号设置需完善头像、名称、功能介绍等基础信息,并合理配置自定义菜单。首先完成认证后,应立即设置清晰有辨识度的头像,命名易记且体现定位的账号名称,撰写直击用户痛点的功能介绍,并配置包含感谢语和引导内容的欢迎语;接着在自定义菜单中规划最多三个一级菜单,每个下设不超过五个二级菜单,将核心功能如…

    2026年8月26日
    100
  • 告别阻塞等待:使用Composer和GuzzlePromises玩转PHP异步编程

    最近在开发一个处理用户提交数据的程序时,遇到了一个棘手的问题:用户输入的文本中包含各种非ASCII字符,例如中文、日文、特殊符号等等。这些字符导致程序在处理字符串时效率低下,甚至出现错误。为了解决这个问题,我尝试了多种方法,最终找到了voku/portable-ascii这个库。Composer在线…

    用户投稿 2026年8月26日
    200
  • Windows中Loader Lock引起的死锁问题

    在程序开发中,常见的做法是将程序模块化,通常实现为动态链接库(dll)。在主程序启动时,可以通过隐式或显式的方式加载这些动态链接库。然而,在windows系统中,如果动态链接库的dllmain函数编写不当,可能会导致一些意想不到的bug,例如典型的loader lock死锁问题。这是一个许多wind…

    2026年8月26日
    000
  • 苹果怎么设浏览器默认_iPhone设置默认浏览器应用教程

    从iOS 14起可设第三方浏览器为默认。先确认Chrome、Edge等已支持并更新,再进入设置→浏览器→默认浏览器应用→选择对应浏览器,最后点击链接验证是否生效。 从iOS 14开始,苹果允许用户将第三方浏览器设为默认应用。虽然系统自带Safari仍是初始默认,但你可以轻松更换成Chrome、Edg…

    2026年8月26日
    100
  • PHP如何安全地生成Akamai授权令牌?matricali/akamai-token-auth助你轻松实现内容保护

    最近在开发一个内容分发平台时,我们选择使用Akamai作为CDN服务商,以确保全球用户都能快速、稳定地访问我们的独家视频内容。然而,一个核心的安全需求摆在了我们面前:这些视频必须是付费用户才能观看,并且我们希望对观看权限进行进一步的限制,比如限制在特定IP地址、或者在一定时间内有效。 一开始,我们尝…

    用户投稿 2026年8月26日
    100
  • Win10如何重命名虚拟桌面

    win10如何修改虚拟桌面名称?win10系统的虚拟桌面功能非常实用,它让我们在同时使用多个应用时,能够轻松地在不同应用之间切换。接下来,小编为大家分享win10如何修改虚拟桌面名称,这样可以让我们在切换桌面时更加精准,避免混淆。 Win10如何修改虚拟桌面名称? 1、首先,下载相关程序并将.zip…

    2026年8月26日
    100
  • 依赖注入(DI)容器设计

    依赖注入容器是一种管理和注入对象依赖的工具,提升代码可维护性和灵活性。设计高效di容器需考虑:1. 生命周期管理(单例、瞬时、范围);2. 依赖解析(处理复杂关系图);3. 配置灵活性(支持多种配置方式);4. 性能优化(缓存、延迟加载、并行解析)。 依赖注入(DI)容器是现代软件开发中一个关键的设…

    2026年8月26日
    000
  • windows提示“此应用已被管理员阻止”怎么办_“此应用已被管理员阻止”的解除方法

    首先检查并修改本地组策略设置,依次进入“用户配置→管理模板→系统”,将“不要运行指定的Windows应用程序”设为“未配置”;若问题仍存,查看AppLocker日志确认是否阻止,必要时禁用Application Identity服务;接着在Windows安全中心关闭SmartScreen筛选器或解除…

    2026年8月26日
    000
  • java中文乱码怎么解决 中文编码问题的排查与修复

    %ignore_a_1%是由于字符编码不一致导致的。解决方法包括:1. 源代码编码设置为utf-8;2. 编译时使用-encoding参数指定utf-8;3. 运行时设置系统属性file.encoding为utf-8;4. 数据库和web应用编码设置为utf-8。 解决Java中文乱码问题是每个开发…

    2026年8月26日
    100
  • 数智融合为天津高质量发展注入新动能

    7月31日,以“数智世界津门有为”为主题的“华为中国行2025·天津新质生产力城市峰会”在天津成功举办。在峰会期间的媒体沟通会上,华为天津政企业务总经理叶紫阳全面分享了华为在本地的技术落地成果与生态合作进展,深入阐述了如何通过数智化转型驱动区域新质生产力的高质量发展。 多场景落地构建四大行业“天津范…

    2026年8月26日
    100
  • excel如何恢复未保存的文件_excel未保存文件恢复与自动保存设置

    首先使用Excel的自动恢复功能尝试找回未保存的文件,重新打开程序后通过“文档恢复”窗格选择并保存所需版本;若无提示,则手动查找“自动恢复文件位置”中的.asd临时文件;同时应启用并配置自动保存功能,设置较短的时间间隔以提升恢复概率;最后可到系统%temp%目录搜索残留的.xlsx或.xls文件,按…

    2026年8月26日
    000
  • win11系统提示管理员权限不足_win11获取最高权限的完整教程

    win11系统提示管理员权限不足_win11获取最高权限的完整教程win11系统提示管理员权限不足_win11获取最高权限的完整教程win11系统提示管理员权限不足_win11获取最高权限的完整教程win11系统提示管理员权限不足_win11获取最高权限的完整教程

    要解决win11管理员权限不足的问题,可以采取以下措施:1. 以管理员身份运行程序;2. 调整uac设置降低敏感度;3. 获取受限制文件或文件夹的所有权;4. 确认当前账户为管理员类型;5. 启用隐藏的内置管理员账户临时解决问题;6. 通过注册表修改提升权限但需谨慎操作。权限问题通常源于uac机制限…

    2026年8月26日 用户投稿
    000
  • ai如何修改虚线描边

    在利用ai进行图形创作时,虚线描边是一种极为常见的视觉处理手法,能够为设计元素增添别具一格的艺术感。熟练掌握虚线描边的调整技巧,有助于我们更自由地实现多样化的创意表达。 首先启动AI软件,绘制或导入需要添加虚线描边的对象。选中目标图形后,前往顶部菜单栏选择“窗口”,然后打开“外观”面板。该面板将清晰…

    2026年8月26日
    100
  • Win10系统如何才能给文件加密?

    Win10系统如何才能给文件加密?Win10系统如何才能给文件加密?Win10系统如何才能给文件加密?Win10系统如何才能给文件加密?

    无论是在工作场景还是个人生活中,总会有一些不想让他人查看的文件,为了避免信息泄露或不必要的窥探,在某些情况下,我们需要对重要文件进行加密保护。那么接下来就为大家介绍如何在windows 10系统中实现文件加密的方法。 教程/步骤: 首先定位到需要加密的文件或文件夹,右键点击该文件或文件夹,选择属性,…

    2026年8月26日 用户投稿
    100
  • 红米Note13RPro怎么取消自动扣费?

    红米Note13RPro怎么取消自动扣费?红米Note13RPro怎么取消自动扣费?红米Note13RPro怎么取消自动扣费?红米Note13RPro怎么取消自动扣费?

    问题:红米note 13r pro手机上自动扣费功能如何取消?简单说明:很多消费场景会自动开通自动扣费功能,导致用户不知情的情况下扣费。引导阅读:本教程将详细介绍红米note 13r pro手机上取消自动扣费的步骤, giúp php小编草莓大家管理好自己的每一笔消费,避免不必要的开支。 红米Not…

    2026年8月26日 用户投稿
    100
  • 周鸿祎感慨国产GPU AI芯片追赶速度令人惊叹:NVIDIA做了30年 华为才做几年

    7月20日消息,近日,360集团创始人兼董事长周鸿祎发布视频对此进行解读,称黄仁勋携h20芯片再度进入中国市场,释放出中美在ai领域竞争加剧的信号。 从产业层面来看,黄仁勋的多次表态透露出几个重要趋势。其一是全球AI芯片格局正在发生变化,尽管NVIDIA依然占据主导地位,但华为等中国企业的进步速度不…

    2026年8月26日
    000
  • 360浏览器官网入口 360浏览器在线登录链接

    360浏览器官网入口是https://browser.360.cn/,提供登录管家、AI搜索、PDF工具、OCR截图识别等功能,基于Chromium132内核,支持双核切换与云同步服务。 360浏览器官网入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来360浏览器在线登录链接,感兴趣的…

    2026年8月26日
    000
  • 如何实现API接口的幂等性?

    实现api接口的幂等性可以通过以下方法:1. 使用唯一标识,如请求id,确保重复请求返回相同结果;2. 状态控制,通过检查订单状态避免重复操作;3. 乐观锁,利用版本号在并发场景下保证幂等性;4. 版本控制,确保请求版本匹配后才处理请求。这些方法各有优劣,需结合具体业务场景选择和优化。 实现API接…

    2026年8月26日
    000

发表回复

登录后才能评论
关注微信