我有一个模板,其中包含.gg名称和年龄两个字段,需要克隆并附加到同一个容器中。我使用以下代码实现了这一点。
html文件
<ng-template #tpl>
<div class="form-group">
<input type="text" id="name" class="form-control" name="name" ngModel
#name="ngModel">
<input type="text" id="age" class="form-control" name="age" ngModel
#age="ngModel">
<button type="Button" >Remove</button>
</div>
</ng-template>
<div>Some element</div>
<form #myForm="ngForm" novalidate (ngSubmit)="save(myForm)">
<div #container>
</div>
<button type="submit">Submit</button>
</form>
<button (click)="gettemplate()">Add Template</button>
<pre>{{myForm.value | json}}</pre>
TS文件
@ViewChild('container', { read: ViewContainerRef }) _vcr;
@ViewChild('tpl') tpl;
gettemplate(){
this._vcr.createEmbeddedView(this.tpl);
}
save(formvalue:NgForm){
console.log(formvalue.value);
}
但是在提交表单后我没有得到表单值,我还需要在单击“删除”按钮时删除克隆的元素。
答案 0 :(得分:3)
这是预期的行为,因为您在ng-template
内定义的所有ngModel都不属于<form #myForm="ngForm"
,因为angular具有层次依赖注入系统。
我可以在这里为您提供两种选择:
1)在ng-template
标记内移动form
<form #myForm="ngForm" novalidate (ngSubmit)="save(myForm)">
<div #container></div>
<button type="submit">Submit</button>
<ng-template #tpl>
<div class="form-group">
<input type="text" id="name" class="form-control" name="name" ngModel
#name="ngModel">
<input type="text" id="age" class="form-control" name="age" ngModel
#age="ngModel">
<button type="Button" >Remove</button>
</div>
</ng-template>
</form>
<强> Stackblirz example 强>
2)在您的组件上提供ControlContainer
明确:
import { NgForm, ControlContainer } from '@angular/forms';
export function controlContainerFactory(component: AppComponent) {
return component.ngForm;
}
@Component({
selector: 'my-app',
templateUrl: `./app.component.html`,
viewProviders: [
{
provide: ControlContainer,
useFactory: controlContainerFactory,
deps: [AppComponent]
}
]
})
export class AppComponent {
...
@ViewChild('myForm') ngForm: NgForm;
...
}
<强> Stackblitz example 强>
另见