【发布时间】:2017-11-19 16:38:36
【问题描述】:
在我们的Angular 4 app 中,我们有一个
-
<parent-component>其中有一个<form> -
<form>有<level-1-child> -
<level-1-child>有<level-2-child> -
<level-2-child>有<textarea>
我们需要做什么?
- 在
<button>点击或提交<parent-component>的<form>上的<parent-component>、<level-1-child>和<level-2-child>的<form>元素
<parent-component> 看起来像这样:
<form [formGroup]="myGroup" #f="ngForm" name="parent-component" (submit)="resetForm(f)" >
<input name="abc" id="abc" formControlName="abc">
<level-1-child [formGroup]="myGroup"></level-1-child>
<input type="submit" value="Reset form">
</form>
<level-1-child> 看起来像这样:
<input name="abc" id="abc" formControlName="abc">
<level-2-child [formGroup]="myGroup">
</level-2-child>
<level-2-child> 看起来像这样:
<div [formGroup]="myGroup">
<textarea formControlName="abc" id="abc" name="abc" [(ngModel)]="level-2-child.txt" >
</textarea>
</div>
parent-component.ts、level-1-child.ts & level-2-child.ts 的代码如下:
import { Component, OnInit } from '@angular/core';
import { ReactiveFormsModule, FormGroup, FormControl } from '@angular/forms';
@Component({
moduleId: module.id,
selector: 'parent-component', //level-1-child, level-2-child
templateUrl: 'parent-component.html' //level-1-child, level-2-child
})
export class ParentComponent { //Level1Child, Level2Child
myGroup = new FormGroup({abc: new FormControl()});
}
此代码仅重置
<parent-component>的input#abc。有什么办法解决这个问题?
到目前为止我们已经尝试过什么?
尝试解决方案 1
根据@StepanZarubin的suggestion,parent-component.ts是这样的:
resetForm(f) {
f.resetForm();
}
使用模板<parent-component> 如下:
<form #f="ngForm" (submit)="resetForm(f)" >
<level-1-child>
<level-2-child>
<level-3-child>
...
<level-n-child>
</level-n-child>
...
</level-3-child>
</level-2-child>
</level-1-child>
<button type="submit"> Submit </button>
</form>
<level-n-child>的模板是:
<input name="inp" id="inp" #inpField="ngModel" [(ngModel)]="childModel.inp">
但是由于某种原因,这不会重置<level-n-child> 的input#inp 元素。
已尝试解决方案 2
尝试解决方案 3
- 使用stuff like
[parentFormGroup]会导致错误:
无法绑定到“parentFormGroup”,因为它不是“level-n-child”的已知属性
当尝试使用 REACTIVE_FORM_DIRECTIVES 解决此错误时会引发另一个错误:
[ts] 模块“node_modules/@angular/forms/forms”没有导出成员“REACTIVE_FORM_DIRECTIVES”。
不过,we're already using the latest 这不是主要问题。
尝试解决方案 4
已尝试解决方案 5
可能的解决方案
- @PaulParton 正在谈论 form group,我们不确定这是否是正确的解决方案。
我们不希望在这些组件上放置大量用于输入/输出的杂乱代码。
我们有没有办法为此使用共享服务之类的东西?
【问题讨论】:
-
仅供参考,REACTIVE_FORMS_DIRECTIVES 在 Angular 2 RC6 中已被弃用和删除。您需要改为导入 ReactiveFormsModule。此外,任何包含输入元素的嵌套组件(例如
<level-1-child>,默认情况下不被视为父表单的一部分。您需要手动通知嵌套组件它们是表单的成员。(这是您链接到的解决方案是:“我们没有考虑这个建议。)那么重置可能会起作用吗? -
@DeborahK 那么我们如何通知嵌套组件它们是表单的成员?
-
您可以继续向下传递表单组。或者,您可以查看是否有其他方法来构建表单,而无需深入到这么多级别。也许你可以构建一个
<level-child>,它可以支持任何级别,而不是有这么多嵌套组件。 -
@DeborahK 请检查我更新的问题。我已将表单传递给子级别,但仍然看起来不太好。你能解释一下
的概念吗? -
澄清一下,在您的问题中重置是什么意思? .reset 方法只重置表单状态。它不会清除数据。这是你的意思吗?如果您想清除数据,无论您使用任何其他表单技术,都必须手动执行。
标签: javascript forms angular typescript angular-components