首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Angular 8-使用formControlName将计算值添加到formGroup中

基础概念

Angular 的 FormControlName 是一个指令,用于将表单控件绑定到 FormGroup 中的特定属性。FormGroup 是 Angular 表单模型的一部分,允许你将多个 FormControl 组织在一起,以便于管理和验证。

相关优势

  1. 结构化表单管理:通过 FormGroupFormControlName,可以更清晰地组织和管理复杂的表单。
  2. 数据绑定:自动将表单控件与组件类中的属性进行双向数据绑定。
  3. 验证和错误处理:方便地进行表单验证和错误处理。

类型

  • FormControl:表示单个表单控件。
  • FormGroup:表示一组 FormControl
  • FormArray:表示一组动态的 FormControl

应用场景

适用于需要复杂表单验证和管理的场景,例如注册表单、登录表单、配置表单等。

示例代码

假设我们有一个简单的表单,其中包含一个计算字段。我们希望在用户输入两个数字后,自动计算它们的和。

HTML 部分

代码语言:txt
复制
<form [formGroup]="myForm">
  <label for="number1">Number 1:</label>
  <input type="number" id="number1" formControlName="number1">

  <label for="number2">Number 2:</label>
  <input type="number" id="number2" formControlName="number2">

  <label for="sum">Sum:</label>
  <input type="text" id="sum" [formControl]="sumControl" readonly>
</form>

TypeScript 部分

代码语言:txt
复制
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormControl } from '@angular/forms';

@Component({
  selector: 'app-calculate-form',
  templateUrl: './calculate-form.component.html',
  styleUrls: ['./calculate-form.component.css']
})
export class CalculateFormComponent implements OnInit {
  myForm: FormGroup;
  sumControl: FormControl;

  constructor(private fb: FormBuilder) {
    this.sumControl = new FormControl('');
  }

  ngOnInit(): void {
    this.myForm = this.fb.group({
      number1: [''],
      number2: ['']
    });

    this.myForm.get('number1').valueChanges.subscribe(() => this.calculateSum());
    this.myForm.get('number2').valueChanges.subscribe(() => this.calculateSum());
  }

  calculateSum(): void {
    const number1 = this.myForm.get('number1').value;
    const number2 = this.myForm.get('number2').value;
    const sum = (number1 || 0) + (number2 || 0);
    this.sumControl.setValue(sum);
  }
}

遇到的问题及解决方法

问题:计算值没有实时更新

原因:可能是由于 valueChanges 订阅没有正确设置,或者计算逻辑有误。

解决方法

  1. 确保 valueChanges 订阅正确设置。
  2. 检查计算逻辑,确保在每次输入变化时都能正确计算。
代码语言:txt
复制
ngOnInit(): void {
  this.myForm = this.fb.group({
    number1: [''],
    number2: ['']
  });

  this.myForm.get('number1').valueChanges.subscribe(() => this.calculateSum());
  this.myForm.get('number2').valueChanges.subscribe(() => this.calculateSum());
}

calculateSum(): void {
  const number1 = parseFloat(this.myForm.get('number1').value);
  const number2 = parseFloat(this.myForm.get('number2').value);
  const sum = (isNaN(number1) ? 0 : number1) + (isNaN(number2) ? 0 : number2);
  this.sumControl.setValue(sum);
}

参考链接

通过以上步骤,你可以成功地将计算值添加到 FormGroup 中,并确保其实时更新。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Angular 从入坑到挖坑 - 表单控件概览

类的实例对应于一个表单控件,在使用时,通过控件的实例赋值给属性,后续则可以通过监听这个自定义的属性来跟踪表单控件的和状态 import { Component, OnInit } from '@angular...,然后控件组的每一个控件作为属性添加到实例 import { Component, OnInit } from '@angular/core'; // 引入 FormControl 和 FormGroup...通过使用 formGroupName 属性 FormGroup 控件组FormGroup 实例绑定到控件上 <form [formGroup]='profileForm' (ngSubmit)=...某些情况下,我们只是想要更新控件组的某个控件的数据,这时需要使用 patchValue 的方式进行更新 import { Component, OnInit } from '@angular/core...]', // 指令注册到 NG_VALIDATORS 使用 multi: true 将该验证器添加到现存的验证器集合 providers: [{ provide: NG_VALIDATORS

18.9K20
  • Angular 表单2--响应式表单, 处理异步数据

    上一节我们定义了一个响应式表单,其中表单数据是在定义的时候就初始化好的,但是很多时候数据需要异步获取,比如 打开一个编辑页面,需要 请求HTTP拿到数据。...根据数据修改表单字段的,最终体现在页面上。 我们改造上一节的例子,成为异步获取数据。...我们先创建service文件, 写一个loadUser方法,模拟HTTP请求 import { Injectable } from '@angular/core'; import { of } from...调用该方法 import { Component } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '...}); this.user$ = this.userService.loadUser().pipe( // tap 返回的还是 Observable 这里我们不订阅,我们在模板中使用

    2.8K30

    Angular系列教程-第四节

    1.表单 Angular 提供了两种不同的方法来通过表单处理用户输入:响应式表单和模板驱动表单。...两者都从视图中捕获用户输入事件、验证用户输入、创建表单模型、修改数据模型,并提供跟踪这些更改的途径 使用’@angular/forms’库FormGroup, FormControl,FormArray...,FormBuilder 等类构建出的数据对象就是响应式的表单,在响应式的表单,我们会在数据源里面进行各种操作,像添加校验等,在html文件中使用 formGroup,formGroupName,formControlName...等数据和视图进行绑定(需要引入ReactiveFormsModule) 模板驱动的表单是我们实例化好一个类的数据之后,在html中使用 NgForm 指令后数据和表单进行绑定,使用[(ngModel...和更新) formgroup使用 表单提交 更新部分内容(patchValue) 表单验证(导入Validators,设置字段属性) 表单状态(status) formarray(管理任意数量控件

    2.8K50

    理论 | Angular 的响应式编程 -- 浅淡 Rx 的流式思维

    ,我们这里合并后都使用 天 作为单位: 合并之后呢,由于我们最终需要向生日那个输入框写入一个日期,而我们合并之后的流给出的是按天数计算的年龄,所以这里显然需要一个转换。...响应式表单的 Rx Angular 的表单处理非常强大,有模版驱动的表单和响应式表单两类,两种表单各有千秋,在不同场合可以分别使用,甚至混合使用,但这里就不展开了。...Angular 处理响应式表单只有 3 个步骤: 1、在组件的 HTML 模版给要处理的控件加上 formControlName="blablabla" 2、form 标签添加 [formGroup...这两个数据流其实是来自于两个控件的的变化,而响应式表单获取值的变化是非常简单的就一行: 上面这行代码的意思是从表单的控件数组取得 formControlName 为 age 的这个控件然后监听其的变化...Angular 4 的 NgIf 的改进 Angular 4 的 ngIf 现在可以携带 else 了,如果你曾经使用Angular 就知道,原来我们是得写两个 ngIf 来完成类似的功能的。

    5.2K10

    Angular 结合 NG-ZORRO 快速开发

    如果熟悉 Vue 或者 React 版本的 Ant Design,相信你可以无缝链接啊~ 我们重新使用 angular-cli 生成一个项目 ng-zorro。...思路: 先添加页面 user 用户的列表页面,使用 ng-zorro table 组件 用户的新增和更改页面可以共用同一个页面,使用 ng-zorro form 组件 页面删除功能直接使用弹窗提示...,使用 ng-zorro modal 组件 对 ng-zorro 组件按需引入 调整路由文件 按照思路,我们得在 ng-zorro 引入: // app.module.ts import { ReactiveFormsModule...这两个功能是公用一个表单的~ 我们在 html 添加: // user-info.component.html <form nz-form [formGroup]="validateForm" class...// user-info.component.ts import { Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup

    1.8K10

    Angular: 最佳实践

    在 TypeScript ,你可以限制字段的或者变量的,比如: interface Order { status: 'pending' | 'approved' | 'rejected' }...并且在模版的每个地方都会显示通知,你可以使用 ngClass 设置未通知的样式。现在,我们想将通知的状态与枚举进行比较,我们必须将枚举导入组件。...Angular 表单,那么这些逻辑移动到一个基础类会更友好...但是你不需要继承 AbstractBaseComponent,因为不是每个组件都有 form 表单。...简单的 HTTP 服务逻辑放在基类,并从中派生 API 服务。...模版 Templates Angular使用 html 模版(当然,还有组件、指令和管道)去渲染你应用程序的视图 ,所以编写模版是不可避免的事情,并且要保持模版的整洁和易于理解是很重要的。

    2.8K40

    在前端理解MVC服务之 Angular篇(完结)

    在第三篇文章,应用程序将使用 Angular 构建,该版本来自TypeScript 的第二个版本。因此,本文介绍应用程序从 TypeScript 到Angular的迁移。...角度允许我们忘记DOM,所以,让user.view.ts文件从我们的应用消失。最后,在最后一篇文章,我们转换代码以将其与 Angular 框架集成。 第 1 部分。...View 模型的直观表示,即用户所看到的部分 Controller - Model与View的链接 下图是我们的项目结构 该文件充当一个画布,使用 元素动态构建整个应用程序。...模型具有以下字段: id 唯一 name 用户名 age 用户年龄 complete bool,可以知道此条数据是否有用 用户的Class已经被写在TS。...另一个有趣的点是,Angular 在此示例帮助我们使用反应形式。有了这些,模板连接到控制器,而无需我们发送处理程序来建立连接。

    4.1K20

    当nz-checkbox-group多选框组遇上必选校验

    当nz-checkbox-group多选框组遇上必选校验 Angular2 ng-zorro-antd checkbox 今天表单中用到ng-zorro-antd组件的多选框nz-checkbox-group...nz-form-control nz-col [nzSpan]="10" [nzValidateStatus]="getFormControl('one')"> <nz-checkbox-group formControlName...this.validateForm.value.one); // 3 console.long(this.validateForm.invalid);// 4 结果发现 初始时:1、false,2、false,3、oneOption...,4、false 选择一个选项后:1、true,2、false,3、oneOption+选中的value,4、false 从而始终无法触发显示 “通知范围必选” 第一次尝试 最开始尝试是this.validateForm.value.scopes...nzValidateStatus 会自动从 NgControl 获取数据,也可以手动指定特定的 NgControl组件表单校>验函数的校验过程和异步返回的结果显示对应的error | validating

    4.3K20

    使用Angular8和百度地图api开发《旅游清单》

    我们收获: Angular8基本用法,架构 使用百度地图API实现自己的地图应用 解决调用百度地图API时的跨域问题 对localStorage进行基础封装,进行数据持久化 material...UI的使用 项目简介 《旅游清单》项目的背景主要是为了让笔者更好的掌握angular8,因为之前做的项目主要是使用vue和react,作为一名合格的coder,必须博学而专一,也是因为笔者早年大学时期想要做的一个想法...组件 每个 Angular 应用都至少有一个组件,也就是根组件,它会把组件树和页面的 DOM 连接起来。...,并存储到storage。...index.scss'] }) export class NewMapComponent implements OnInit { @Input() product; // 指定product从父组件传递

    6K30

    一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序

    如果您是从头开始创建一个新组件,并忘记向NgModule添加一个新模块,但尝试将其添加到您的标记,那么您的应用程序无法使用JS控制台中的下一个错误: Uncaught Error: Template...使用本地事件 所以我们有我们的变量填充,但我们仍然需要将该发送到AppComponent的卡列表。为了数据传递给Angular组件,我们必须有输入。...文本中有一个我们字段的名称,一个空字符串是初始,Validators.compose显然允许我们多个验证器合并到一个字段。我们使用.value并.setValue('')获得我们领域的价值。...通过使用formControlName,我们告诉Angular我们应该使用哪种反应形式的字段。 就目前而言,以前的方法与模板驱动的表单和反应形式的新方法之间的主要区别在于反应方面的更多编码。...让我们Ngrx添加到我们的应用程序

    42.6K10

    Angular5.0.0新特性

    第一,我们可以应用程序的一部分标记为纯应用(pure),改进了现有工具提供的摇树优化,删除了应用其它不需要的部分。...在5.0管道可以使用我们自己的实现,可以在任何地方实现本地化的支持和配置。.../指令的多命名支持,在对用户不修改代码情况下进行组件的迁移操作等非常有用,一个组件导出多个名字,可以让组件已一个新名字来使用而达到不破坏现有代码的目的。...8.HttpClient   在4.3HttpClient模块被封装在@angular/common,新的HttpClient被封装在@angular/common/http,更新Http模块后...同时也更新了.tsconfig更严格的遵循TypeScript标准, 10.Angular Forms adds updateOn Blur / Submit   可以使用blur/submit来进行事件更新

    1.7K10

    移除 View Engine 转用 Ivy,盘点Angular 12的重要更新

    基于此,Angular 12 启动了加速转移计划,官方移除 View Engine,并且禁止使用 View Engine 创建应用程序的功能,而且新函数库专案默认使用 Ivy。...现在,运行 ng build 默认使用生产版本,可节约操作步骤并防止您意外开发版本部署至应用当中。 默认情况下,CLI 启用严格模式以捕捉开发早期的各种错误。...严格 null 检查报告各可能为 null 的片段。这同样是一项重大变化。 APP-INITIALIZER 令牌的类型有所变更,旨在准确反映 Angular 处理的返回类型。同样属于重大变化。...在新版本,您可以通过 BrowserAnimationsModulewithConfig 禁用动画。 向 FormArray 与 FormGroup 引入 emitevent 选项。...在表单,引入最小与最大验证器。 新版本可导出 HTTP 状态码列表。 向 Angular 语言服务添加一项功能,允许用户直接访问使用模板文件的组件的实际位置。

    4.4K10

    (转) 别再对 Angular 表单的 ControlValueAccessor 感到迷惑

    首先我解释下为啥需要 ControlValueAccessor 接口以及它在 Angular 是如何使用的。...然后我展示如何封装第三方组件作为 Angular 组件,以及如何使用输入输出机制实现组件间通信(译者注:Angular 组件间通信输入输出机制可参考官网文档),最后展示如何使用 ControlValueAccessor...FormControl 和 ControlValueAccessor 如果你之前使用Angular 表单,你可能会熟悉 FormControl ,Angular 官方文档将它描述为追踪单个表单控件和有效性的实体对象...如果你使用响应式表单,你需要显式创建 FormControl 对象,并使用 formControl 或 formControlName 指令来绑定原生控件;如果你使用模板驱动方法,FormControl...,当 Angular 在组件模板遇到 input 或 textarea DOM 原生控件时,会使用DefaultValueAccessor 指令: @Component({ selector:

    3.8K20
    领券