在一个Angular 16应用程序中,我有一个模板驱动的表单,它将直接包含一个文本字段和我的提交按钮.它还包含一个组件,该组件将包含一些常见的可重用表单字段,因此我将表单引用作为输入传递给它.

我遇到了一个问题,组件中的字段没有添加到我的表单中.如何从组件中将输入与表单相关联?请参见下面的演示链接.

100

问题是组件中的字段不会添加到表单中,因此当它们无效时,它们不会影响父表单.

下面是我问题中的代码,但上面的链接将是一个更好的示例

具有窗体的主体组件

<form #myForm="ngForm" (ngSubmit)="submit(myForm)">
  <label for="fieldOne">One (directly in form)</label>
  <input
    type="text"
    id="fieldOne"
    name="fieldOne"
    [ngClass]="{
      'is-invalid': fieldOne.invalid && (fieldOne.touched || myForm.submitted)
    }"
    required
    #fieldOne="ngModel"
    [(ngModel)]="fieldOneVal"
  />

  <br /><br />

  <app-form-editor [form]="myForm"/>

  <br />
  <button type="submit">Submit</button>
  <strong *ngIf="submitSuccess" class="text-success">Sucessfully submitted!</strong>

  <br />

  <pre>myForm.valid: {{myForm.valid}}</pre>
  <pre>myForm.value: {{myForm.value | json}}</pre>
</form>

百人组

import { Component, Input, OnInit } from '@angular/core';
import { NgForm } from '@angular/forms';

@Component({
  selector: 'app-form-editor',
  templateUrl: './form-editor.component.html',
})
export class FormEditorComponent implements OnInit {
  @Input() form!: NgForm;

  fieldTwoVal = '';

  ngOnInit(): void {}
}
<label for="fieldTwo" class="control-label">Two (Inside Component)</label>
<input
  name="fieldTwo"
  id="fieldTwo"
  [ngClass]="{
    'is-invalid': fieldTwo.invalid && (fieldTwo.touched || form.submitted)
  }"
  required
  [(ngModel)]="fieldTwoVal"
  #fieldTwo="ngModel"
/>

<br />
<pre>component form.valid: {{ form.valid }}</pre>
<pre>component form.value: {{ form.value | json }}</pre>

推荐答案

只需在应用程序表单编辑器中添加一个viewProvider即可.

@Component({
  selector: 'app-form-editor',
  templateUrl: './form-editor.component.html',
  viewProviders:[{ provide: ControlContainer, useExisting: NgForm }]
})

您可以这样想:在您的子组件中,您需要添加"form ngForm",但是您 Select 了Not Add或Use Existing 注意:如果我们使用的是reactive Forms,则要添加的viewProvider是viewProviders:[{ provide: ControlContainer, useExisting: FormGroupDirective }]

Angular相关问答推荐

Angular 17上的material 工具提示的自定义样式

Angular 17自定义指令渲染不起作用'

如何使用新的@for遍历Angular 为17的对象?

如何重新显示ngbAlert(Bootstrap widgest for Angular)消息后再次驳回它

MAT-复选框更改事件未在onSubscriberCheck函数中返回选中的值

如何修复不允许的HttpErrorResponse 405?

Angular 信号 - 使用 mutate() 与使用 forEach() react 性

Summernote 文本区域的输入字段文本验证失败

如何处理Angular 延迟订阅

如何使用 Angular 12 material 验证密码和确认密码?

如何在 Angular 5 HttpInterceptor 中添加多个标头

如何在Angular2中基于特定的构建环境注入不同的服务?

在 Ionic 2 中使用 NodeJS.Timer 时找不到命名空间 NodeJS

如何测试 Angular2 的 router.navigate?

如何在 Angular2 中的所有请求的请求标头中发送Cookie?

Angular 2 http 没有得到

在Angular2中获取服务的域名

提交后在Angular 2中重置表单

angular2 测试,我如何模拟子组件

如何在 Angular Material 中设置图标的 colored颜色 ?