如何在 Angular 模板中遍历 JSON 对象并显示键值对
发布时间 - 2026-01-29 00:00:00 点击率:次本文详解如何使用 angular 内置的 `keyvaluepipe` 遍历任意 json 对象(非数组),在 html 模板中以 `
在 Angular 中,*ngFor 默认仅支持可迭代对象(如数组),但 JSON 对象本身不可直接遍历。幸运的是,Angular 提供了内置管道 KeyValuePipe(自 v6.1 起可用),它能将对象自动转换为 {key: string, value: any}[] 形式的数组,从而完美适配 *ngFor。
✅ 正确的数据结构准备(TypeScript 层)
关键前提是:确保组件 TS 文件中定义的属性名与模板中引用的名称完全一致,且结构扁平化。避免多层嵌套导致路径错误。
根据你的 Handlebars 模板逻辑,应将数据简化为:
// 在组件类中(例如 email-preview.component.ts)
export class EmailPreviewComponent implements OnInit {
Previous: Record = {};
Current: Record = {};
ngOnInit() {
// 假设你已通过服务或输入获取到 formData
const formData = {
Message_Body: {
formChanges: {
Previous: { Events: 'TEST', AdditionalInfo: '' },
Current: { Events: 'TEST111', AdditionalInfo: 'test' }
}
}
};
this.Previous = formData.Message_Body.formChanges.Previous;
this.Current = formData.Message_Body.formChanges.Current;
}
} ⚠️ 注意:原代码中 templateInput = { Message_Body: { Previous, Current } } 会导致模板需写成 Message_Body.Message_Body.Previous —— 这是常见错误根源。务必解构赋值为顶层属性(如 Previous / Current),提升可读性与健壮性。
✅ HTML 模板:用 | keyvalue 管道遍历对象
在 .html 文件中,直接使用 *ngFor + keyvalue 管道即可:
Title: This following has been changed!
Previous Values
- 0; else noPrev">
- {{ item.key }}: {{ item.value === '' || item.value == null ? '(empty)' : item.value }}
No previous values.
Current Values
- 0; else noCurr">
- {{ item.key }}: {{ item.value === '' || item.value == null ? '(empty)' : item.value }}
No current values.
✅ 效果输出:
Title: This following has been changed! Previous Values • Events: TEST • AdditionalInfo: (empty) Current Values • Events: TEST111 • AdditionalInfo: test
? 补充说明与最佳实践
-
keyvalue 管道默认按插入顺序排序(Angular ≥ 12),如需按字母序排列键,可传入比较函数:
compareKeys = (a: KeyValue
, b: KeyValue ) => a.key.localeCompare(b.key); 空值/undefined 安全处理:模板中使用 item.value === '' 显式判断空字符串(HTML 渲染时 {{ '' }} 会留白,建议统一提示为 (empty) 或 -)。
性能提示:keyvalue 管道在每次变更检测时会创建新数组。若对象极大(>100 键),建议在组件中预处理为数组并 OnPush 策略优化。
替代方案(不推荐):手动在 TS 中 Object.entries(obj) 转数组 → 更冗余,失去模板声明式优势;keyvalue 是 Angular 官方推荐的标准解法。
掌握 | keyvalue,你就能优雅、简洁、可维护地渲染任意结构化 JSON 数据——无论是配置项、表单快照,还是审计日志中的字段变更对比。
# html
# js
# json
# go
# typescript
# ai
# win
# 键值对
# 可迭代对象
# 排列
# angular
# String
# Object
# 字符串
# 数据结构
# undefined
# 对象
# 遍历
# 的是
# 这是
# 就能
# 适用于
# 将对
# 如需
# 它能
# 表单
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在云主机上快速搭建网站?
简单实现Android验证码
如何获取免费开源的自助建站系统源码?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Angular 表单中正确绑定输入值以确保提交与验证正常工作
如何在搬瓦工VPS快速搭建网站?
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
潮流网站制作头像软件下载,适合母子的网名有哪些?
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
Laravel如何配置任务调度?(Cron Job示例)
三星网站视频制作教程下载,三星w23网页如何全屏?
移动端脚本框架Hammer.js
Laravel怎么连接多个数据库_Laravel多数据库连接配置
Python面向对象测试方法_mock解析【教程】
简单实现jsp分页
Python文件异常处理策略_健壮性说明【指导】
如何在云服务器上快速搭建个人网站?
Laravel如何使用Telescope进行调试?(安装和使用教程)
香港网站服务器数量如何影响SEO优化效果?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
高防服务器租用如何选择配置与防御等级?
如何在建站宝盒中设置产品搜索功能?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法
如何快速上传建站程序避免常见错误?
Firefox Developer Edition开发者版本入口
历史网站制作软件,华为如何找回被删除的网站?
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
音响网站制作视频教程,隆霸音响官方网站?
微信小程序 scroll-view组件实现列表页实例代码
网站制作大概多少钱一个,做一个平台网站大概多少钱?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
Laravel如何实现用户注册和登录?(Auth脚手架指南)
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
黑客入侵网站服务器的常见手法有哪些?
微信小程序 wx.uploadFile无法上传解决办法
JavaScript数据类型有哪些_如何准确判断一个变量的类型
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何实现javascript表单验证_正则表达式有哪些实用技巧
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程


