我想将父组件的FormGroup
传递给其子组件,以便使用子组件显示错误消息。
给定以下父级:
parent.component.ts
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
});
}
}
我现在想把上面的form:FormGroup变量传递给下面的子组件:
error-message.component.ts
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/上遵循这个过时的示例
8条答案
按热度按时间9rbhqvlz1#
在父零部件中执行以下操作:
然后在你的子组件中,你可以像这样获得这个引用:
你甚至可以确保
formGroupName
或[formGroup]
在你的组件上被指定,通过改变它的选择器,如下所示:这个答案应该足够满足你的需求,但如果你想知道更多,我在这里写了一篇博客:
https://peterlesliemorris.com/angular-how-to-create-composite-controls-that-work-with-formgroup-formgroupname-and-reactiveforms/
qyuhtwio2#
对于Angular 11,我尝试了上述所有答案,并进行了不同的组合,但没有一个对我有效。因此,我最终采用了以下解决方案,它对我来说就像我想要的那样。
TypeScript
HTML
用途
请注意,我必须添加
ngDefaultControl
,否则它将在控制台中给予默认值accessor error(如果有人知道如何在没有错误的情况下摆脱它-将非常感谢)。vxf3dgd43#
这是在父formGroup中使用的子组件的示例:子组件ts:
css日期选择器:
然后这样使用:
ffscu2ro4#
父组件:
子组件:
klr1opcd5#
ngOnInit
很重要--这在构造函数中不起作用。我更喜欢查找FormControlDirective
-它是在子组件的祖先层次结构中找到的第一个yks3o0rb6#
我会这样做,我已经通过子窗体数据作为一组父,所以你可以在提交调用分离的表单数据。
父级:
孩子:
父级.ts:
Child.ts
在子窗体组件中,
@Input() formGroup: FormGroup;
部分将是父组件的引用cedebl8k7#
我将表单作为输入传递给子组件;
当然,你需要将表单从父组件传递给子组件,你可以用不同的方式来完成,但最简单的是:
在你父母的某个地方;
wvt8vs2t8#
如果要从子组件访问父组件,可以访问FormControl示例的parent属性https://angular.io/api/forms/AbstractControl#parent
要获取父错误,请执行以下操作: