首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用当前表单API将父组件的FormGroup传递给其子组件

如何使用当前表单API将父组件的FormGroup传递给其子组件
EN

Stack Overflow用户
提问于 2016-07-23 15:45:15
回答 8查看 73K关注 0票数 38

我希望将父组件的FormGroup传递给其子组件,以便使用子组件显示错误消息。

鉴于以下父母:

parent.component.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Component, OnInit } from '@angular/core'
import {
  REACTIVE_FORM_DIRECTIVES, AbstractControl, FormBuilder, FormControl, FormGroup, Validators
} from '@angular/forms'

@Component({
  moduleId: module.id,
  selector: 'parent-cmp',
  templateUrl: 'language.component.html',
  styleUrls: ['language.component.css'],
  directives: [ErrorMessagesComponent]
})
export class ParentCmp implements OnInit {
  form: FormGroup;
  first: AbstractControl;
  second: AbstractControl;
  
  constructor(private _fb: FormBuilder) {
    this.first = new FormControl('');
    this.second = new FormControl('')
  }
  
  ngOnInit() {
    this.form = this._fb.group({
      'first': this.first,
      'second': this.second
    });
  }
}

现在,我想将上面的表单:FormGroup变量传递给下面的子组件:

error-message.component.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Component, OnInit, Input } from '@angular/core'
import { NgIf } from '@angular/common'
import {REACTIVE_FORM_DIRECTIVES, FormGroup } from '@angular/forms'

@Component({
  moduleId: module.id,
  selector: 'epimss-error-messages',
  template: `<span class="error" *ngIf="errorMessage !== null">{{errorMessage}}</span>`,
  styles: [],
  directives: [REACTIVE_FORM_DIRECTIVES, NgIf]  
})
export class ErrorMessagesComponent implements OnInit {
  @Input() ctrlName: string

  constructor(private _form: FormGroup) { }

  ngOnInit() { }

  get errorMessage() {
    // Find the control in the Host (Parent) form
    let ctrl = this._form.find(this.ctrlName);
    console.log('ctrl| ', ctrl);

//    for (let propertyName of ctrl.errors) {
//      // If control has a error
//      if (ctrl.errors.hasOwnProperty(propertyName) && ctrl.touched) {
//        // Return the appropriate error message from the Validation Service
//        return CustomValidators.getValidatorErrorMessage(propertyName);
//      }
//    }

    return null;
  }

构造函数formGroup表示父构造函数的FormGroup --在其当前形式中,它不工作。

我试着在http://iterity.io/2016/05/01/angular/angular-2-forms-and-advanced-custom-validation/学习这个过时的例子

EN

回答 8

Stack Overflow用户

发布于 2017-08-10 13:04:18

在父组件中这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div [formGroup]="form">
  <div>Your parent controls here</div>
  <your-child-component [formGroup]="form"></your-child-component>
</div>

然后,在您的子组件中,您可以获得如下所示的引用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export class YourChildComponent implements OnInit {
  public form: FormGroup;

  // Let Angular inject the control container
  constructor(private controlContainer: ControlContainer) { }

  ngOnInit() {
    // Set our form property to the parent control
    // (i.e. FormGroup) that was passed to us, so that our
    // view can data bind to it
    this.form = <FormGroup>this.controlContainer.control;
  }
}

您甚至可以通过以下方式更改组件的选择器,从而确保在组件上指定了formGroupName[formGroup]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
selector: '[formGroup] epimss-error-messages,[formGroupName] epimss-error-messages'

这个答案应该足以满足你的需要,但是如果你想知道更多,我在这里写了一个博客:

https://mrpmorris.blogspot.co.uk/2017/08/angular-composite-controls-formgroup-formgroupname-reactiveforms.html

票数 50
EN

Stack Overflow用户

发布于 2021-04-05 17:57:42

对于角度11,我尝试了以上所有的答案,并以不同的组合,但没有什么对我很有效。因此,我最终得到了如下的解决方案,这对我来说就像我想要的那样。

TypeScript

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component({
  selector: 'fancy-input',
  templateUrl: './fancy-input.component.html',
  styleUrls: ['./fancy-input.component.scss']
})
export class FancyInputComponent implements OnInit {

  valueFormGroup?: FormGroup;
  valueFormControl?: FormControl;

  constructor(
    private formGroupDirective: FormGroupDirective, 
    private formControlNameDirective: FormControlName
  ) {}

  ngOnInit() {
    this.valueFormGroup = this.formGroupDirective.form;
    this.valueFormControl = this.formGroupDirective.getControl(this.formControlNameDirective);
  }

  get controlName() {
    return this.formControlNameDirective.name;
  }

  get enabled() {
    return this.valueFormControl?.enabled
  }

}

HTML

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div *ngIf="valueFormGroup && valueFormControl">
    <!-- Edit -->
    <div *ngIf="enabled; else notEnabled" [formGroup]="valueFormGroup">
        <input class="input" type="text" [formControlName]="controlName">        
    </div>
    <!-- View only -->
    <ng-template #notEnabled>
        <div>
            {{valueFormControl?.value}}
        </div>
    </ng-template>
</div>

用法

请注意,我必须添加ngDefaultControl,否则它将不会在控制台中给出默认值访问器错误(如果有人知道如何在没有错误的情况下消除它,我们将不胜感激)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<form [formGroup]="yourFormGroup" (ngSubmit)="save()">
    <fancy-input formControlName="yourFormControlName" ngDefaultControl></fancy-input>
</form>
票数 10
EN

Stack Overflow用户

发布于 2019-02-21 02:15:22

这是父formGroup内部使用的子组件示例:子组件ts:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Component, OnInit, Input } from '@angular/core';
import { FormGroup, ControlContainer, FormControl } from '@angular/forms';


@Component({
  selector: 'app-date-picker',
  template: `
  <mat-form-field [formGroup]="form" style="width:100%;">
  <input matInput [matDatepicker]="picker" [placeholder]="placeHolder" [formControl]="control" readonly>
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker #picker></mat-datepicker>
</mat-form-field>
<mat-icon (click)="clearDate()">replay</mat-icon>`,
  styleUrls: ['./date-picker.component.scss']
})

export class DatePickerComponent implements OnInit {
  public form: FormGroup;
  public control : FormControl;
  @Input() controlName : string;
  @Input() placeHolder : string;


  constructor(private controlContainer: ControlContainer) { 
  }

  clearDate(){
    this.control.reset();
  }

  ngOnInit() {
    this.form = <FormGroup>this.controlContainer.control;
    this.control = <FormControl>this.form.get(this.controlName);
    }

}

css日期选择器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mat-icon{
position: absolute;
left: 83%;
top: 31%;
transform: scale(0.9);
cursor: pointer;
}

像这样使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <app-date-picker class="col-md-4" [formGroup]="feuilleForm" controlName="dateCreation" placeHolder="Date de création"></app-date-picker>
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38547389

复制
相关文章
一行命令搭建内部的管道
在上一篇《边缘计算k8s集群之SuperEdge》文章中,笔者基于ECK搭建了边缘集群并添加了节点。通过边缘集群,我们可以很方便的管理各个地域的节点,本地、各云厂商的机房、客户所在地、海外的都可以。在本篇内容,我们将讲述如何使用ipsec-vpn-server,通过一行命令即可搭建内部的管道,用于锻炼技术,技术学习。
心莱科技雪雁
2021/03/09
2.3K0
一行命令搭建内部的管道
在上一篇《边缘计算k8s集群之SuperEdge》博客中,笔者基于ECK搭建了边缘集群并添加了节点。通过边缘集群,我们可以很方便的管理各个地域的节点,本地、各云厂商的机房、客户所在地、海外的都可以。在本篇内容,我们将讲述如何使用ipsec-vpn-server,通过一行命令即可搭建内部的管道,用于锻炼技术,技术学习。
雪雁-心莱科技
2021/03/05
2.9K0
一行命令搭建内部的管道
函数内部的this指向
这些 this 的指向,是当我们调用函数的时候确定的。调用方式的不同决定了this 的指向不同
清出于兰
2020/10/26
1.7K0
函数内部的this指向
Java——内部类使用总结(基本概念、定义内部类、static定义内部类、方法中定义内部类)
类的组成包括:成员、方法,几乎所有程序都不会对嵌套程序有什么限定,内部类指的是在一个类中继续嵌套其他类结构的一种代码形式,且理论上可以一直嵌套。
Winter_world
2020/09/25
5530
Java——内部类使用总结(基本概念、定义内部类、static定义内部类、方法中定义内部类)
Angular 自定义管道
本文将使用 UltimateAngular/angular-pro-src 中的示例,来一步步介绍自定义管道的相关知识。在该示例中,我们将定义一个 FileSizePipe 管道,它用于实现对文件大小进行格式化显示。
阿宝哥
2019/11/05
1.5K0
体验usually.js的管道函数——pipe函数
usually.js 是一个面向现代 Web 开发的 JavaScript 函数库,基于 ES6 开发。最新版本2.4.1,最新版本usually.js增加管道函数—— pipe 函数。什么是管道函数?管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存。
用户6167509
2019/09/04
1K0
java内部类的作用(三)----定义使用回调函数的时候比较便捷---匿名内部类(anonymous)
匿名内部类(anonymous inner calss):将局部内部类的使用再深入一步。假如只创建这个类的一个对象,就不必命名了。这种类被称为匿名内部类。
wust小吴
2019/07/05
1.4K0
java内部类的作用(三)----定义使用回调函数的时候比较便捷---匿名内部类(anonymous)
内部函数与外部函数
函数是c语言程序中的最小单位,往往把一个函数或多个函数保存为一个文件,这个文件称为源文件。定义一个函数,这个函数就要被另外的函数所调用。但当一个源程序由多个源文件组成时,可以指定函数不能被其他文件调用,这样C语出又把函数分为两类:一个是内部函数,另一个是外部函数。
pigeon
2022/04/11
9820
Linux命名管道及函数
管道(pipe)应用的一大局限是没有名字,只能用于具有亲缘关系进程之间的通信。而命名管道,也称FIFO,实质是一种文件类型,通过FIFO可以用于任何两个进程间的通信。
xxpcb
2020/08/04
2.7K0
【Angular教程】自定义管道
这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战 一、管道的作用 方便我们在模板中对我们的数据进行格式化处理。 二、内置的常用管道 具体API参照官网查询使用 DatePipe: 格式化日期 UpperCasePipe: 文本转为全部大写 LowerCasePipe: 文本转为全部小写 TitleCasePipe: 文本转为标标题形式(如: hello world=>Hello World) KeyValuePipe: 将对象转为键值对形式 JsonPipe: 转为JSON字符串
前端小鑫同学
2022/12/25
1.3K0
【Angular教程】自定义管道
Clojure集合管道函数练习
TDD讨论组里的申导最近在B站直播了Martin Fowler的经典文章Refactoring with Loops and Collection Pipelines中谈到的利用集合管道对循环进行函数式重构。视频地址在这里,申导的翻译在这里。组织者小波(Seaborn Lee)趁机出了一道关于集合管道函数题目。我就想啊,论函数式编程,舍Clojure其谁?而且我在Clojure很少能写出loop... recur这样偏底层的循环代码。话不多说,撸起袖子开工。
lambeta
2018/08/17
1.1K0
【说站】java内部类的内存泄漏原因
2、如果内部类只是在外部类中引用,当外部类不再引用时,外部类和内部类可以通过GC回收。
很酷的站长
2022/11/23
5630
【说站】java内部类的内存泄漏原因
详解javascript中的即时函数,内部函数,能重写自身的函数即时函数内部函数返回函数的函数能重写自己的函数小结
在上篇谈到匿名函数和回调函数的基础上,我们接着介绍javascript中的即时函数,内部函数,返回函数的函数,能重写自身的函数等几种常见的函数类型及使用方法。只需要大致了解匿名函数的概念,应该就能看懂这些内容
desperate633
2018/08/22
1.6K0
7.6 内部函数和外部函数
2、对变量而言,声明与定义的关系稍微复杂一些。在声明部分出现的变量有两种情况:一种是需要建立存储空间的,另一种是不需要建立存储空间的。前者称为定义性声明,简称定义;后者称为引用性声明。
小林C语言
2019/07/12
1.1K0
6.8 内部函数和外部函数
解释:只能被本文件中其他函数所调用,在定义内部函数时,在函数名和函数类型的前面加static,所以内部函数又称静态函数
小林C语言
2019/08/19
7510
react 函数内部调用全局函数
错误信息 react TypeError: Cannot read property 'up' of undefined at 错误信息 react Unhandled Rejection (TypeError): Cannot read property 'setState' of undefined
wo.
2021/06/15
2.7K0
Ionic3 自定义管道
本文根据官网的例子简单介绍Angular管道的创建和使用,Angular官方文档 创建管道 创建一个管道可以直接使用ionic cli 工具 ionic g pipe sxypie 和创建 指令基本类似,导入导出也是一样的。 sxypie.ts 代码如下 import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'sxypie', pure: true, //true表示纯管道, false表示非纯管道 })
spilledyear
2018/08/21
4150
Ionic3 自定义管道
静态内部类和内部类的区别_内部类不能定义为抽象类
参考静态内部类和非静态内部类的区别中提到的 正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则,我试验了一下 ,无论是静态类还是非静态类都可以写在接口里。
全栈程序员站长
2022/11/10
3480
静态内部类和内部类的区别_内部类不能定义为抽象类
linux系统编程之管道(一):匿名管道和pipe函数
该文介绍了Linux环境下C++编写高性能可扩展的进程通信程序的设计和实现,主要包括管道、命名管道、信号、共享内存、消息队列、互斥量等进程间通信方式,以及通过Boost.Asio库实现的高性能TCP/UDP通信,并结合实际应用场景给出了性能测试和对比分析。
s1mba
2017/12/26
2.2K0
linux系统编程之管道(一):匿名管道和pipe函数
php面试笔记(5)-php基础知识-自定义函数及内部函数考点
在面试中,考官往往喜欢基础扎实的面试者,而函数相关的考点,往往是大家容易忽视的一个点,今天冷月就来帮各位小伙伴们梳理一下,在面试中函数相关的注意点。
学长冷月
2020/08/02
5260

相似问题

在管道函数内部检查值

11

管道擦伤原因

13

函数内部的函数定义

20

函数内部定义函数

20

管道破裂的原因

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文