子组件中的formControlName

Gab*_*iel 8 angular angular-reactive-forms

我想创建一个自定义输入组件并在表单中重用它,但是我遇到了formGroup和formControlName的问题。

// Form
<form [formGroup]='loginForm'>
  <custom-input [myFormControlName]='email'></custom-input>
</form>

// CustomInput Component's Template
<input formControlName='myFormControlName'>
Run Code Online (Sandbox Code Playgroud)

问题似乎是formControlName预期与FormGroup指令一起使用,并且由于我在子组件中使用formControlName,所以找不到formControlName。有人知道如何解决该问题吗?

Gh1*_*111 10

我知道有两种方法可以实现这种行为,一种是 Sofia 在上面的答案中提到的,第二种方法是传递formControl给子组件!

父组件 HTML 内部

<child-component
   [control]="parentForm.get('form-control-name-you-want-to-pass-down')">
</child-component>
Run Code Online (Sandbox Code Playgroud)

里面child-component

@Input() control: AbstractControl = new FormControl();
Run Code Online (Sandbox Code Playgroud)

子组件 HTML 内部

<input [formControl]="control" />
Run Code Online (Sandbox Code Playgroud)


ale*_*nko 6

您需要在子组件中实现控制值访问器,请在此处阅读更多内容https://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html

  • 但是您可以做的是扩展DefaultValueAccessor。componentName扩展了DefaultValueAccessor,您将拥有默认valueAccessor中的所有方法 (2认同)
  • 这是一个旧的答案,但我想提一下添加的链接作为参考(https://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html)是一个不同形式的概念。该示例适用于模板驱动表单,而不是使用“formContrlName”的反应式表单。但问题是关于“formControlName”。 (2认同)

Sof*_*fia 5

就像@MassimoVariolo 的文章提到的那样,您可以将表单作为输入传递给子组件。

父组件html:

<child-component [form]="form"></child-component>
Run Code Online (Sandbox Code Playgroud)

子组件 ts 文件:

@Input() public form: FormGroup;
Run Code Online (Sandbox Code Playgroud)

子组件 html(你需要 div 和formGroup,否则你会得到一个错误):

<div [formGroup]="form">
    <input formControlName="myFormControlName"> 
</div>
Run Code Online (Sandbox Code Playgroud)