何时使用 FormGroup 与 FormArray?

2023-11-25

表格组:

A 表格组将每个子 FormControl 的值聚合为一个 对象,以每个控件名称作为键。

const form = new FormGroup({
  first: new FormControl('Nancy', Validators.minLength(2)),
  last: new FormControl('Drew')
});

表格数组:

A 表格数组将每个子 FormControl 的值聚合到一个 大批。

const arr = new FormArray([
  new FormControl('Nancy', Validators.minLength(2)),
  new FormControl('Drew')
]);

什么时候应该使用其中一种而不是另一种?


FormArray 是 FormGroup 的变体。关键区别在于它的数据被序列化为数组(而不是在 FormGroup 中被序列化为对象)。当您不知道组中将出现多少个控件(例如动态表单)时,这可能特别有用。

让我尝试通过一个简单的例子来解释。假设您有一个表单,可以在其中捕获客户的披萨订单。您还可以放置一个按钮,让他们添加和删除任何特殊请求。这是组件的 html 部分:

<section>
  <p>Any special requests?</p>
  <ul formArrayName="specialRequests">
    <li *ngFor="let item of orderForm.controls.specialRequests.controls; let i = index">
      <input type="text" formControlName="{{i}}">
      <button type="button" title="Remove Request" (click)="onRemoveSpecialRequest(i)">Remove</button>
    </li>
  </ul>
  <button type="button" (click)="onAddSpecialRequest()">
    Add a Request
  </button>
</section>

这是定义和处理特殊请求的组件类:

constructor () {
  this.orderForm = new FormGroup({
    firstName: new FormControl('Nancy', Validators.minLength(2)),
    lastName: new FormControl('Drew'),
    specialRequests: new FormArray([
      new FormControl(null)
    ])
  });
}

onSubmitForm () {
  console.log(this.orderForm.value);
}

onAddSpecialRequest () {
  this.orderForm.controls
  .specialRequests.push(new FormControl(null));
}

onRemoveSpecialRequest (index) {
  this.orderForm.controls['specialRequests'].removeAt(index);
}

FormArray 比 FormGroup 提供了更大的灵活性,因为使用“push”、“insert”和“removeAt”比使用 FormGroup 的“addControl”、“removeControl”、“setValue”等操作 FormControl 更容易。FormArray 方法确保控件在表单的层次结构中正确跟踪。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用 FormGroup 与 FormArray? 的相关文章

随机推荐

  • 为什么调用该函数? JavaScript / 窗口

    我的 HTML 文件中有以下代码
  • 在自定义/用户控件 (Winforms) 中添加对嵌套容器的设计时支持

    我有类似于向导控件的东西 中间是一个我想用来放置任何子控件的面板 我发现使用 ScrollableControlDesigner 将允许将删除的控件添加到自定义 用户控件中 但这不是我所需要的 它需要添加到容器中 以便可以应用布局而不影响
  • 使用 re.sub 和多次替换仅替换捕获的组

    下面只是我创建的一个简单示例 string I love sleeping I love singing I love dancing pattern re compile r I love w 我只想用 re sub 替换 w 部分 这个
  • C# 基类方法使用的成员变量重写

    好吧 我承认这有点奇怪 但它确实有一个合乎逻辑的目的 我在当前项目中使用 C 并试图找到一种方法来重写派生类中的成员变量 但在基类方法中访问被重写的变量 为了让事情变得更 有趣 如果重写的成员变量是静态的 这在下面的示例代码中没有显示 那就
  • Delphi中简单的读/写记录.dat文件

    由于某种原因 即使我昨天使用过 我的 OpenID 帐户也不再存在 但不管怎么说 我需要将记录数据保存到 dat 文件中 我尝试了很多搜索 但都是与数据库和BLOB的东西有关 我无法从中构建任何东西 我有以下记录 type Scores r
  • Cassandra 中的 IN 关系对查询不利吗?

    给出 CQL 中以下选择的示例 SELECT FROM tickets WHERE ID IN 1 2 3 4 给定 ID 是分区键 使用 IN 关系比执行多个查询更好还是没有区别 我记得不久前在 Cassandra 用户邮件列表中看到有人
  • Python argparse --toggle --no-toggle 标志

    有没有简单直接的使用方法 toggle and no togglePython 的 argparse 的标志 现在我正在使用类似于以下内容的东西 import argparse parser argparse ArgumentParser
  • for循环条件下方法调用的效率

    我正在编写一个游戏引擎 其中一组对象保存在一个ArrayList使用 for 循环进行迭代 显然 效率相当重要 所以我想知道循环的效率 for String extension assetLoader getSupportedExtensi
  • React 高阶组件强制重新渲染包装组件

    我正在努力了解如何在高阶组件中正确实现此验证行为 编辑 TLDR 感谢用户 noa dev 的出色建议 我在这里创建了一个 React Fiddle https jsfiddle net 8nLumb74 1 来展示问题 简而言之 为什么我
  • 使用 Google Directions API 问题绘制具有超过 8 个航点的路线图

    我正在尝试绘制具有多个航点的路线图 根据谷歌API 您只能使用8个航点 对于业务开发 您只能使用23个航点 但这不足以绘制准确的旅行地图 我得到了一个值得注意的解决方案链接在这里但没有正常工作 该解决方案在某种程度上存在一个问题 它无法绘制
  • 如何获取eclipse的JDT源码?

    我正在尝试编写一个Eclipse插件 但我发现默认情况下没有源 我在 www eclipse org 上搜索 但没有找到任何东西 我的日食是3 6 2 哪里可以得到JDT的源码 似乎在最新版本的 Eclipse 至少是 Juno 和 Kep
  • Solr - 不区分大小写的搜索不起作用

    我想对字段应用不区分大小写的搜索myfield在 solr 中 我用谷歌搜索了一下 我发现我需要申请LowerCaseFilterFactory字段类型和字段应该是solr TextFeild 我将其应用到我的schema xml并重新索引
  • 在 matlab exe 中使用标准 io 流:stdin 和 stdout

    Question 我希望它能够 监听 正在运行 已编译 的 Matlab 可执行文件中的标准输入流 我相信这就是完成的方式c或类似的语言 include stdio h fgets line 256 stdin 或者更详细地说 它可以这样使
  • std::bind 类内部的静态成员函数

    我正在尝试存储一个函数以便稍后调用 这是一个片段 这工作正常 void RandomClass aFunc int param1 int param2 double param3 bool isQueued false If some co
  • Maven 生成实际的 jar 作为 .jar.original 而不是 .jar 文件

    基本上我有一个 Maven 项目 我正在尝试使用生成我的项目的 jarmvn clean compile package通过 spring 工具套件使用下面的 pom xml 执行命令后 我在我的目录中生成了2个jar文件target文件夹
  • Crashlytics iOS - 第 0 行崩溃 - Swift 源

    我目前在某些 Swift 源文件发生崩溃时遇到问题 事实上 在 Crashlytics 上我有一个关于线路和崩溃原因的奇怪信息 它告诉我源已经崩溃了line 0它给了我一个SIGTRAP错误 我读到当线程遇到断点时会发生此错误 但问题是 当
  • System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity 的奇怪问题

    我们正在编写一个系统 允许用户通过 Intranet 上的 Web 应用程序更改其帐户密码 起初 一切似乎都进展顺利 在开发过程中 我们的测试帐户的密码可以毫无问题地更改 然而 当我们让系统上线时 我们开始遇到问题 以下是症状 起初 一切都
  • SQL服务器触发器

    我有一个这样的表结构 create table status master Name varchar 40 status varchar 10 如果状态列值更新值 我需要为状态列创建触发器 如果失败 则触发器调用一个插入命令 例如 inse
  • 如何在空间和频率域中的每个尺度和方向创建 64 个 Gabor 特征

    通常 Gabor 滤波器 顾名思义 用于过滤图像并提取与过滤方向相同的所有内容 在这个问题中 您可以看到比此中编写的代码更有效的代码Link 假设 4 个方向上有 16 个尺度的滤波器 因此我们得到 64 个 gabor 滤波器 scale
  • 何时使用 FormGroup 与 FormArray?

    表格组 A 表格组将每个子 FormControl 的值聚合为一个 对象 以每个控件名称作为键 const form new FormGroup first new FormControl Nancy Validators minLengt