问题描述
我正在尝试创建一个可以通过使用 ng-template 重复使用的表单。但不知何故,当我保存表单并调用函数 doAddMenuItem(postForm)
时,组件中的数据无法访问。
这是带有 ngTemplateOutlet
的表单:
<form (submit)="doAddMenuItem(postForm)" #postForm="ngForm">
<ng-template [ngTemplateOutlet]="MsgRef"></ng-template>
<button class="button medium button__save">Save</button>
</form>
还有 ng 模板:
<ng-template #MsgRef>
<ul class="list">
<li>Titel:</li>
<li><input type="text" name="title" [(ngModel)]="menuItemObj.title"></li>
</ul>
<ul class="list">
<li>Symbol:</li>
<li><input type="text" name="symbol" [(ngModel)]="menuItemObj.symbol"></li>
</ul>
<ul class="list">
<li>Meer weten link:</li>
<li><input type="text" name="more_info_link" [(ngModel)]="menuItemObj.more_info_link"></li>
</ul>
<ul class="list">
<li>Bericht:</li>
<li>
<editor [init]="froalaOptions" name="text" [(ngModel)]="menuItemObj.text"></editor>
</li>
</ul>
</ng-template>
以及组件中的函数:
doAddMenuItem(formData) {
console.log(formData.value);
}
解决方法
似乎 NgForm 只能跟踪嵌套模板中的控件。
要使其工作,您需要在表单标签中移动 #MsgRef 模板。
Project_BM
为了使您的控件真正可重用,我建议您通过实现 ControlValueAccessor 接口来创建自定义表单控件。 因此,您将能够以任何形式使用此自定义控件:
<form (submit)="doAddMenuItem(postForm)" #postForm="ngForm">
<ng-template [ngTemplateOutlet]="MsgRef"></ng-template>
<button class="button medium button__save">Save</button>
<ng-template #MsgRef>...</ng-template>
</form>
型号:
<form (submit)="doAddMenuItem(postForm)" #postForm="ngForm">
<app-menu-item-control name="menuItem" [(ngModel)]="menuItem"></app-menu-item-control>
<button class="button medium button__save">Save</button>
</form>
MenuItem 表单控件:
export interface MenuItem {
title: string;
symbol: string;
moreInfoLink: string;
text: string;
}