带有 ng-content -> form.valid/dirty 等的 Angular 表单不起作用

Posted

技术标签:

【中文标题】带有 ng-content -> form.valid/dirty 等的 Angular 表单不起作用【英文标题】:Angular Form with ng-content -> form.valid/dirty etc not working 【发布时间】:2020-04-08 04:17:51 【问题描述】:

我想创建一个可重复使用的表单组件,如下所示:

<my-form>
   <input [ngModel]="value" (ngModelChange)="onChange($event)"/>
</my-form>

&lt;my-form&gt; 组件如下所示:

<form>
  <ng-content></ng-content>
</form>

但是,my-form 组件中的表单看不到任何注入的元素,因此如果表单中的元素发生变化,则 form.valid/dirty 等不会更新

这个问题/问题已在 *** 上被问过几次, 见https://***.com/questions/40843307/q-how-to-use-angular-2-template-form-with-ng-content

解决方案是手动将元素添加到表单中,例如:

 public ngAfterViewInit(): void 
    let ngContentModels = this.models.toArray();
    ngContentModels.forEach((model) => 
    this.form.addControl(model);
);

使用此解决方法,表单可以正确更新有效/脏等属性,但是,注入元素的每次更改都会导致触发 ngModelChange 事件两次。在我的示例中,每次更改都会调用方法 onChange($event) 2 次​​p>

<input [ngModel]="value" (ngModelChange)="onChange($event)"/>

您知道如何“修复”手动添加元素的方法吗?或者有没有其他方法可以处理带有&lt;ng-content&gt; 注入元素的表单?

【问题讨论】:

【参考方案1】:

当您希望您的组件 (my-form) 了解外部形式时,您应该考虑将其作为输入添加并传递:

@Input myForm: FormGroup;
<form [formGroup]="myForm">
  <ng-content></ng-content>
</form>

【讨论】:

以上是关于带有 ng-content -> form.valid/dirty 等的 Angular 表单不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Angular 10 ng-content 投影导致表格冻结

当 ngIf 为 false 时构建 Angular4 ng-content

将上下文传递给 Angular 2 组件的投影内容(使用 ng-content)

当父组件使用 ng-content Angular 时从子组件访问父组件

如何使用 Dojo 提交带有 dijit.form.Form 的帖子数据?

将带有 --form-string 的 curl 命令转换为 URL