如何在单击父按钮单击时重置子输入的数据和视图? [英] How to reset data and view of child input on click of parent's button click?
问题描述
在我们的 Angular 4 应用中,我们有一个
有一个有
有
有
我们需要做什么?
- 重置
的元素,
&
在点击或提交
的<;表格>
看起来像这样:
<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="重置表单"></表单>
看起来像这样:
<level-2-child [formGroup]="myGroup"></level-2-child>
看起来像这样:
<textarea formControlName="abc" id="abc" name="abc" [(ngModel)]="level-2-child.txt" ></textarea>
parent-component.ts
的代码,level-1-child.ts
&level-2-child.ts
位于以下几行:
import { Component, OnInit } from '@angular/core';从@angular/forms"导入 { ReactiveFormsModule, FormGroup, FormControl };@成分({模块 ID:module.id,selector: 'parent-component',//level-1-child, level-2-childtemplateUrl: 'parent-component.html'//level-1-child, level-2-child})export class ParentComponent {//Level1Child, Level2ChildmyGroup = new FormGroup({abc: new FormControl()});}
<块引用>
此代码只是重置
的input#abc
.有什么办法可以解决这个问题?
到目前为止我们尝试了什么?
尝试了解决方案 1
根据 @StepanZarubin 的 建议,parent-component.ts
是这样的:
resetForm(f) {f.resetForm();}
使用模板
像这样:
的模板为:
但是由于某种原因,这不会重置
的 input#inp
元素.
尝试了解决方案 2
- 我们不想使用
boolean
发送给孩子的值
尝试了解决方案 3
- 使用诸如
[parentFormGroup]
之类的东西会导致错误:
无法绑定到parentFormGroup",因为它不是level-n-child"的已知属性
当尝试使用 REACTIVE_FORM_DIRECTIVES
引发另一个错误:
[ts] 模块node_modules/@angular/forms/forms"没有导出成员REACTIVE_FORM_DIRECTIVES".
但是,我们已经在使用最新的,这不是主要问题.
尝试了解决方案 4
尝试了解决方案 5
可能的解决方案
- @PaulParton 正在谈论 表单组,我们不确定这是否是正确的解决方案.
我们不希望在这些组件上放置大量混乱的输入/输出代码.
有没有办法使用共享服务之类的东西?
要使用空"数据初始化表单,我会这样做:
initializeProduct(): IProduct {//返回一个初始化对象返回 {编号:0,产品名称:空,产品代码:空,标签: [''],发布日期:空,价格:空,描述:空,星级:空,图片网址:空};}
然后绑定到初始化的产品.
您可以在此处找到完整示例:https://github.com/DeborahK/Angular2-ReactiveForms(特别是 APM 文件夹).
此代码适用于我在 Pluralsight 上的Angular Reactive Forms"课程,如果您想了解有关其构建方式的更多详细信息:https://app.pluralsight.com/library/courses/angular-2-reactive-forms/table-of-contents
In our Angular 4 app, we've a
<parent-component>
which has a<form>
- The
<form>
has<level-1-child>
- The
<level-1-child>
has<level-2-child>
- The
<level-2-child>
has<textarea>
What we need to do?
- Reset the
<form>
elements of<parent-component>
,<level-1-child>
&<level-2-child>
on<button>
click or submit of<parent-component>
's<form>
<parent-component>
looks like this:
<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>
And the <level-1-child>
looks like this:
<input name="abc" id="abc" formControlName="abc">
<level-2-child [formGroup]="myGroup">
</level-2-child>
And the <level-2-child>
looks like this:
<div [formGroup]="myGroup">
<textarea formControlName="abc" id="abc" name="abc" [(ngModel)]="level-2-child.txt" >
</textarea>
</div>
The code of parent-component.ts
, level-1-child.ts
& level-2-child.ts
is on the following lines:
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()});
}
This code is only resetting the
input#abc
of<parent-component>
. What is the fix for this?
What we have tried so far?
Tried solution 1
As per @StepanZarubin's suggestion, the parent-component.ts
is like this:
resetForm(f) {
f.resetForm();
}
with template <parent-component>
like this:
<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>
The template of <level-n-child>
is:
<input name="inp" id="inp" #inpField="ngModel" [(ngModel)]="childModel.inp">
However for some reason, this is not resetting the input#inp
element of <level-n-child>
.
Tried solution 2
- We do not want to use
boolean
value sent to the child
Tried solution 3
- Using stuff like
[parentFormGroup]
is resulting in an error:
Can't bind to 'parentFormGroup' since it isn't a known property of 'level-n-child'
when tried to solve this error using REACTIVE_FORM_DIRECTIVES
throws another error:
[ts] Module '"node_modules/@angular/forms/forms"' has no exported member 'REACTIVE_FORM_DIRECTIVES'.
However, we're already using the latest and this is not the main problem.
Tried solution 4
- It seems like input is the solution, however since there are lot of components - we're not considering this suggestion
Tried solution 5
Possible solution
- @PaulParton is talking about form group, we're not sure as to if this is the correct solution or not.
We don't wish to put a lot of messy code for input/outputs on these components.
Is there a way we can use something like shared services for this?
To initialize a form with "empty" data, I do something like this:
initializeProduct(): IProduct {
// Return an initialized object
return {
id: 0,
productName: null,
productCode: null,
tags: [''],
releaseDate: null,
price: null,
description: null,
starRating: null,
imageUrl: null
};
}
And then bind to the initialized product.
You can find a complete example here: https://github.com/DeborahK/Angular2-ReactiveForms (specifically the APM folder).
This code is for my "Angular Reactive Forms" course on Pluralsight if you want to see more details on how it was built: https://app.pluralsight.com/library/courses/angular-2-reactive-forms/table-of-contents
这篇关于如何在单击父按钮单击时重置子输入的数据和视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!