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

news2024/11/14 14:51:16

最近在处理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.coloradmin.cn/o/988198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 定时任务 传参 及 之前创建 Python包遇到的问题

一 Python 调度器传参 1.1 按位置传参 注意调 args 设置好之后,使用 scheduler.start() 启动调度器。 # 设置调度器 scheduler BlockingScheduler() # 采用阻塞的方式 # 分拆上传数据模块,上传算法使用的数据 scheduler.add_job(funcup_load_da…

这些日常运维实用技巧,忍不住拍案叫绝~

需求 在运维工作中随着我们积累的经验不断增多,不知你是否遇到过以下几个场景: Linux 如何快速删除大量文件? Vsphere 如何在不重启的情况下识别新添加的iscsi硬盘? Linux 中 rm 命令如何做到防误删? 不同 Linux 服…

「四维轻云」v1.4.1版本更新内容

「四维轻云」v1.4.1版本更新主要包含以下内容: 1、倾斜模型三种加载方式 2、矢量数据上传(SHP) 3、单体化(绘制及SHP生成) 一、倾斜模型的三种加载方式 在倾斜模型的编辑窗中,可设置数据的加载方式&am…

简单斜率优化

凸壳取点 现在平面上有 n n n个点: ( x i , y i ) (x_i,y_i) (xi​,yi​) 现有一次函数: y k x b ykxb ykxb。 要求一次函数必须至少经过平面当中的一个点。则一次函数可以写作: y i k ⋅ x i b y_ik\cdot x_ib yi​k⋅xi​b 如果斜率…

php版 短信跳转微信小程序

实现这功能首先&#xff0c;小程序端添加业务域名 php代码 <?php declare (strict_types1);namespace app\controller\Admin;use app\model\Set; use app\Request;class Admin_Url_Scheme {public function getScheme(Request $request) {$appid 小程序appid;$secret 小…

问道管理:股票空头是什么意思?

在炒股的时分&#xff0c;咱们经常听到股票空头。那么股票空头到底是什么意思呢&#xff1f;股票空头是相对于股票多头而言的一个术语。股票多头指的是经买入股票并盈利的股民&#xff0c;而股票空头则指的是经过售卖股票猎取赢利的股民。 在一段时间内&#xff0c;股票的涨跌…

如何利用 Selenium 对已打开的浏览器进行爬虫

大家好&#xff01; 在对某些网站进行爬虫时&#xff0c;如果该网站做了限制&#xff0c;必须完成登录才能展示数据&#xff0c;而且只能通过短信验证码才能登录 这时候&#xff0c;我们可以通过一个已经开启的浏览器完成登录&#xff0c;然后利用程序继续操作这个浏览器&…

使用GPA和夜神模拟器实现K帧

之前使用过GPA配合夜神模拟器实现K帧&#xff0c;来查看实际的渲染情况&#xff0c;后来一段时间没有使用&#xff0c;就忘记了具体步骤&#xff0c;这次边试边实现一下相关的具体步骤。 首先去英特尔官网下载工具&#xff1a;https://www.intel.com/content/www/us/en/develo…

看完这位小哥的GitHub,我沉默了

就在昨天&#xff0c;一个名为win12的开源项目一度冲上了GitHub的Trending热榜。 而且最近项目的Star量也在飙升&#xff0c;目前已经获得了2.2k的Star标星。 出于好奇&#xff0c;点进去看了看。好家伙&#xff0c;项目README里写道这是一个14岁的初中生所打造的开源项目。 即…

Mybatis学习笔记1 Mybatis入门

差不多根据mybatis中文文档:创建第一个mybatismaven项目,将它跑起来 入门_MyBatis中文网 新建库 建表 创建项目 重启之后 配置下Maven与encoding 成习惯了 新建模块 注意:这个GroupId和ArtifactId version是之后,你用Maven install时候后存放的包路径和包名 目录结构:虽然换…

aws-msk-托管kafka集群的简单使用(VPC内部访问:无验证和SASL认证)

1.使用控制台创建即可 根据实例类型创建需要至少15分以上&#xff0c;可以提前创建好ec2实例和Secrets Manager,一会会使用到 2. 创建Secrets Manager &#xff08;使用无认证时请跳过&#xff09; 官方文档&#xff1a;https://docs.aws.amazon.com/zh_cn/msk/latest/deve…

Transformer(一)—— Attention Batch Normalization

Transformer详解 一、RNN循环神经网络二、seq2seq模型三、Attention&#xff08;注意力机制&#xff09;四、Transformer4.1 self attention4.2 self-attention的变形——Multi-head Self-attention4.3 Masked Attention4.4 Positional Encoding4.5 Batch Normalization4.6 Lay…

接口自动化之测试数据动态生成并替换

一、测试数据 1. 随机库random 查看内置random方法&#xff0c;该方法自行学习&#xff0c;不再介绍。 show 2. Faker库 pip install faker showHttps://github.com/joke2k/faker 3. 应用到项目中 3.1 思路 在用例数据中添加标志位&#xff0c;设计这个标志位为 {{特…

“数智+绿色”驱动,宏工科技助力线缆线材稳定高品质生产

9月4日-7日&#xff0c;WIRE CHINA 2023中国国际线缆及线材展览会在上海新国际博览中心举办。宏工科技现场展出线缆线材自动化生产一站式解决方案&#xff0c;与现场观众共商“数字化、智能化、绿色化”发展机遇。 线缆是制造业中最大或产品使用范围最广的基础性配套产业之一&a…

索尼 toio™ 应用创意开发征文|创新音乐创作工具的诞生

引言 音乐创作一直是人类创造力的一项重要表现形式。然而&#xff0c;随着技术的不断进步&#xff0c;我们希望能够开发出更加创新的音乐创作工具&#xff0c;以激发音乐人的灵感和创造力。toio™音乐Q宝的诞生正是为了满足这一需求。 一、开发 1.1 toio™机器人初邂逅 toi…

测试开发 | Java 接口自动化测试首选方案:REST Assured 实践

1 . 初识 REST Assured 在 REST Assured 的官方 GitHub 上有这样一句简短的描述&#xff1a; Java DSL for easy testing of REST services 简约的 REST 服务测试 Java DSL 1.1 优点&#xff1a; REST Assured 官方的 README 第一句话对进行了一个优点的概述&#xff0c;总的…

如何把Word转换成PDF文档?分享操作简单的方法

在人们办公过程中&#xff0c;word、excel以及pdf这三种格式的文件经常会被使用到。这三类文件因为格式不同&#xff0c;使用时理论上应该是各管各的&#xff0c;但是实际使用时却时不时会遇到要对它们三者进行格式转换的情况。那么&#xff0c;如何把Word转换成PDF文档呢?接下…

通过IP地址进行精准定位技术、方法与隐私问题的探讨

导语&#xff1a;随着互联网和移动设备的普及&#xff0c;通过IP地址进行精准定位已成为现实。这一技术的发展带来了许多便利&#xff0c;但也引发了隐私问题的关注。本文将探讨通过IP地址进行精准定位的技术、方法以及涉及的隐私问题。 技术和方法&#xff1a; IP地址的基…

荧光量子产率测试用的是什么积分球

LED(Light-EmittingDiode)作为一种新型的固态光源&#xff0c;以其绿色环保、寿命超长、高效节能等特点成为继白炽灯、荧光灯和高压气体放电灯之后的第四代照明光源。 蓝光LED芯片和钇铝石榴石&#xff08;YAG&#xff09;荧光粉封装在一起得到白光LED的方法具有结构简单、制作…

线程池|单例模式|STL、智能指针线程安全|读者写者问题

线程池 线程池的逻辑思想&#xff1a; 每当我们处理一个任务就要创建一个线程&#xff0c;创建线程的开销是很大的。因此我们可以预先创建一批线程&#xff0c;任务队列里没有任务的时候&#xff0c;每个线程都休眠&#xff0c;当队里中有任务的时候&#xff0c;就可以唤醒线程…