当前位置: 首页 > news >正文

angular中多层嵌套结构的表单如何处理回显问题

最近在处理angular表单时,有一个4层结构的表单。而且很多元素时动态生成,如下:

 this.validateForm=this.fb.group({storeId: ["test12"],storeNameKey:[''],config:this.fb.group({ tableSize:this.fb.group({toggle:[false],groupSize:this.fb.array([this.fb.group({cate:['indoor'],title_en:[''],title_zh:[''],tableSize:this.fb.array([this.fb.group({size: [""],desc_en:["small"],desc_zh: ["小桌"],number:['A02'],preTitle: ["C"],maxPerson: [8],minPerson: [5],alias: "S",}),])}),this.fb.group({cate:['outdoor'],title_en:[''],title_zh:[''],tableSize:this.fb.array([this.fb.group({size: ["small"],desc_en:["Small"],desc_zh: ["小桌"],number:['A02'],preTitle: ["C"],maxPerson: [8],minPerson: [5],alias: "S",}),])}),]),}),hasMoreTableSize:['false'],geoFancing:this.fb.group({// isOpenGeo:['true'],range:[100]}),dynamicQRCode:this.fb.group({refreshEx:[2]}),isLogin:[false],isShowBlockList:[false]}),})

其界面表现如下:

而在编辑的状态时如何根据后端返回数据结构进行回显。angular中formbuilder对象提供了setValue和patchValue两个方法。这两个方法只对一层对象有效,对于多层嵌套的数据结构,无法生效。经过摸索,发现可以这种方式解决。

首先模拟后端数据结构:

const formdata={storeId:"disneycart",storeNameKey:"123",config:{tableSize:{toggle:true,groupSize:[{cate:"indoor",title_en:'',title_zh:'',tableSize:[{alias: "S",desc_en: "small",desc_zh: "小4桌",maxPerson: 4,minPerson: 1,number: "A01",preTitle: "A",size: "small"},{alias: "m",desc_en: "middl",desc_zh: "中桌",maxPerson: 6,minPerson: 4,number: "b01",preTitle: "B",size: "middle"},{alias: "L",desc_en: "large",desc_zh: "中桌",maxPerson: 6,minPerson: 4,number: "b01",preTitle: "c",size: "large"},]},{cate:"outdoor",title_en:'',title_zh:'',tableSize:[{alias: "S",desc_en: "small",desc_zh: "小4桌",maxPerson: 4,minPerson: 1,number: "A01",preTitle: "A",size: "small"},{alias: "m",desc_en: "middl",desc_zh: "中桌",maxPerson: 6,minPerson: 4,number: "b01",preTitle: "B",size: "middle"}]}]},dynamicQRCode:{refreshEx:200},geoFancing:{range:200.,// isOpenGeo:false},hasMoreTableSize:true,isLogin:true,isShowBlockList:true}    
}

我们在页面初始化的时候模拟把该数据返回给前端进行回显。

  ngAfterViewInit(){setTimeout(()=>{this.repatchForm(formdata)console.log("settimeout---后", this.validateForm)},2000)}
repatchForm(responseData:any){let arr2=this.resetAndGetGroupSize(responseData)            console.log("settimeout---前", this.validateForm)this.validateForm.patchValue({storeId: responseData.storeId,storeNameKey: responseData.storeNameKey,config: {tableSize: {toggle: responseData.config.tableSize.toggle,groupSize: arr2},hasMoreTableSize: responseData.config.hasMoreTableSize,geoFancing: {range: responseData.config.geoFancing.range},dynamicQRCode: {refreshEx: responseData.config.dynamicQRCode.refreshEx},isLogin:responseData.config.isLogin,isShowBlockList:responseData.config.isShowBlockList}});}

注意此处是核心 ,我们新建一个新的formGroup对象,然后通过表单对象把原本里面的group干掉

最后通过patchValue进行重新复制。 这里特别注意我们清空原本的groupSize对象,最后通过遍历新的后端数据生成新的formArray对象,最后把这个新的formArray对象通过patchValue的方式进行重新赋值即可生效。

//处理会显时table列表数据resetAndGetGroupSize(resData:any){let arr=resData?.config?.tableSize?.groupSize.map((group: any) => {return this.fb.group({cate: group.cate,title_en: group.title_en,title_zh: group.title_zh,tableSize: this.fb.array(group.tableSize.map((table: any) => {return this.fb.group({size: table.size,desc_en: table.desc_en,desc_zh: table.desc_zh,number: table.number,preTitle: table.preTitle,maxPerson: table.maxPerson,minPerson: table.minPerson,alias: table.alias});}))})})this.groupSize.clear()arr.forEach((item:FormGroup)=>{this.groupSize.push(item)})let arr2=arr.map((item:FormGroup)=>{return item.value})return arr2}

 

 

http://www.lryc.cn/news/163782.html

相关文章:

  • Leetcode646. 最长数对链
  • Windows 下安装NPM
  • 【ARM CoreLink 系列 2 -- CCI-400 控制器简介】
  • LeetCode(力扣)77. 组合Python
  • uniapp h5 微信缓存,解决版本更新还是旧版本
  • Nacos——Distro一致性协议
  • 大模型参数高效微调PEFT的理解和应用
  • 工作游戏时mfc140u.dll丢失的解决方法,哪个方法可快速修复mfc140u.dll问题
  • 选择排序——直接选择排序
  • 【C++基础】观察者模式(“发布-订阅”模式)
  • 从业多年,我总结出软件测试工程师必须掌握的技能,你不可错过!
  • 【nerfStudio】5-nerfStudio导出3D Mesh模型
  • 重要公告|投票委托已经上线,应该如何选择社区代表?
  • 【操作系统】聊聊进程、线程、协程
  • springboot 下 activiti 7会签配置与实现
  • RK3399平台开发系列讲解(内核调试篇)spidev_test工具使用
  • 点云从入门到精通技术详解100篇-自适应点云局部邻域特征的特征提取与配准(续)
  • VBA技术资料MF52:VBA_在Excel中突出显示前 10 个值
  • leetcode做题笔记134. 加油站
  • Allegro166版本如何在颜色管理器中实时显示层面操作指导
  • 纷享销客入选中国信通院《高质量数字化转型产品及服务全景图》
  • C高级 DAY4
  • C高级day4
  • Java8-17 --- idea2022
  • Mybatis---增删改查
  • 开机性能-如何抓取开机systrace
  • VBA技术资料MF54:VBA_EXCEL实时获取鼠标位置
  • 模电课程设计
  • 【2023研电赛】兆易创新命题三等奖: 低成本单母线电流永磁同步无感驱动器
  • 原生Js 提取视频中的音频