我被告知我根本不应该将formGroup从子级传递给父级,而是相反地传递给它,为什么呢?
这是我正在尝试的简单演示; https://stackblitz.com/edit/angular-kjnfws
答案 0 :(得分:1)
考虑到您将拥有50多个;您应该使“简单表单组件”尽可能简单和幂等。这将使您的组件简单,易于理解,可重用,并具有单一且定义明确的职责,所有这些都将使测试能力变得更容易。
使它们保持简单的另一个重要原因是;当在不同的父母中使用时,它们将具有不同的验证。几乎有必要使它们与任何逻辑尽可能地隔离。结果;除了拥有FormGroups
并将其以某种方式传递给父级(事件发射器或Viewchild)之外,他们根本不应该拥有FormGroup
!因为当它们内部定义了FormGroup
或FormControl
时,您还需要为父组件中的那些设置验证逻辑。相反,您应该在父级和子级表单组件中定义FormGroup
和FormControl
,它们的FormControls
必须作为@Input()
。例如;
export class Form1Component {
@Input() firstNameFC: FormControl;
@Input() lastNameFC: FormControl;
}
<h2>Form 1: </h2>
<div>
<label>First Name: </label>
<input type="text" [formControl]="firstNameFC">
<label>Last Name:</label>
<input type="text" [formControl]="lastNameFC">
</div>
您的父级组件应处理FormGroup
和FormControl
的创建逻辑及其验证逻辑。通过这种方法,您将可以在单个点上很好地控制应用程序逻辑以及测试能力。
export class ParentComponent {
public parentFG: FormGroup;
constructor(private fb: FormBuilder) {
this.parentFG = this.fb.group({
firstName: ["", Validators.required /** control level validators */],
lastName: [""],
school: [""],
address: [""],
}, {
validators: [addressSchoolValidator /** group level validators */]
});
}
}
<form1 [firstNameFC]="parentFG.get('firstName')" [lastNameFC]="parentFG.get('lastName')"></form1>
<form2 [schoolFC]="parentFG.get('school')" [addressFC]="parentFG.get('address')"></form2>
这是上述概念的演示>>> https://stackblitz.com/edit/angular-ewel8g
另外;在您的示例中,您还创建了一个单独的提交组件。在该示例的上下文中,我发现它没有必要。提交逻辑也属于父组件。
但是,如果您有一个用例,需要将多个父组件组合在一起并一起提交,那么就很有意义。在这种情况下,需要在以父级组件作为子级的祖父母组件中处理提交逻辑。
这时您将面对您的实际问题; “将formGroup从孩子传递给父母的更好的方法是什么?”
在上面的我的堆栈闪电示例中,我使用ViewChild
来收集父组件,由于一些原因,我更喜欢它用于事件发出;
我希望这些对您有所帮助...
答案 1 :(得分:-1)