文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Angular中如何使用FormArray和模态框

2023-07-04 20:28

关注

本篇内容介绍了“Angular中如何使用FormArray和模态框”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

业务场景

使用FormArray制作动态表单。每创建一个表单,页面就新增一个input显示表单填写的,点击编辑再跳转到点击表单的填写内容。

    // 封装获取modelList    get modelList() {        return this.formGroup.get('modelList') as FormArray    }    constructor(private fb: FormBuilder) {}    ngOnInit() {        // 一开始初始化arr为空数组        this.formGroup = this.fb.group({            // 内部嵌套FormControl、FormArray、FormGroup            modelList: this.fb.array([])        })    }    // 模态框构造内部的表单    function newModel() {        return this.fb.group({            modelName: [''],            // 可以继续嵌套下去,根据业务需求        })    }    // 省略模态框部分代码    // 传递到模态框的FormArray    selectedType: FormArray

表单列表

Angular中如何使用FormArray和模态框

表单详情【模态框】

Angular中如何使用FormArray和模态框

<form [FormGroup]="formGroup">    <div FormArrayName="modelList">        <ng-container *nfFor="let item of modelList.controls;let i = index" [FormGroupName]="i">            <nz-input-group                [nzSuffix]="suffixIconSearch"              >                <input type="text" nz-input formControlName="modelName"/>              </nz-input-group>              <ng-template #suffixIconSearch>                <span                  nz-icon                  nzType="edit"                  class="hover"                  (click)="showModal(i)"                ></span>              </ng-template>        </ng-container>    </div></form><nz-modal  [(nzVisible)]="isVisible"  nzTitle="Model"  [nzFooter]="modalFooter"  (nzOnCancel)="handleCancel()"  (nzOnOk)="handleOk()">  <ng-container *nzModalContent>    <form nz-form [formGroup]="selectedType">      <nz-form-item>        <nz-form-label nzRequired>Model Test</nz-form-label>        <nz-form-control>          <input            type="text"            nz-input            placeholder="请输入ModelName"            formControlName="modelName"          />        </nz-form-control>      </nz-form-item>      <nz-form-item>        <nz-form-control>          <product-config></product-config>        </nz-form-control>      </nz-form-item>    </form>  </ng-container>  <ng-template #modalFooter>    <button *ngIf="!isNewModel" nzDanger nz-button nzType="default" (click)="handleDelete()">删除</button>    <button *ngIf="isNewModel" nz-button nzType="default" (click)="handleCancel()">取消</button>    <button nz-button nzType="primary" (click)="handleOk()">保存</button>  </ng-template></nz-modal>

由于这种模态框比较特殊,割裂了表单的FormGroup之间的关系,在点击的时候需要传递参数到模态框显示部分值,如果单纯传递参数使用this.modelList.at(index)获取实体到模态框上进行赋值修改,在模态框点击保存后会发现修改的值没有在表单更新,而表单上对input值修改发现可以影响到模态框的内容。

但是模态框新增的表单却可以响应到页面中去。

原错误代码思路

this.modelList.removeAt(this.modelIndex)this.modelList.insert(this.modelIndex, this.selectedType)


newModelType(): FormGroup {    return this.fb.group({      modelName: ['', Validators.required],      configList: this.fb.array([]),    });  }// ...省略// 模态框显示show() {    this.isVisible = true    this.selectedType = this.newModelType();}// 保存save() {    this.isVisible = false    // 原页面FormArray    this.modelList.push(this.selectedType);}

最后发现这种写法只能够单向改变,页面外input修改值会影响到模态框,但是模态框的值改变保存却让外部没有更新。通过console方式查看页面的FormArray内部参数发现其实是有改变的,只是angular没有检测到。这个时候判断没有发生响应的原因一般是没有触发angular检测机制,仔细查看文档发现有一行很重要 angular文档在最下面写着

Angular中如何使用FormArray和模态框

原本第一次阅读的时候,觉得我遵守了这种原则,因为在编辑的时候,我选择了操控原FormArray进行元素删除和插入,是遵循了这种规则,但是实际上在模态框赋值就已经违反了这种原则,我在赋值的时候拿了FormArray的元素实例赋值给模态框的临时变量,然后更改实例的值,又重新删除插入,本质上我操作的是同一个实例,所以angular没有检测到发生变化【虽然值发生改变】

Angular中如何使用FormArray和模态框

所以正确的做法是啥??

在赋值的地方不能偷懒,仍然要重新创建新对象,再拿原对象的赋值。【相当于深拷贝】

      this.selectedType = this.newModelType();      const old = this.modelList.at(index);      this.selectedType.setValue({        'modelName': old.get('modelName').value    })

这时候就可以正常更新了。

“Angular中如何使用FormArray和模态框”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯