我在我的模板中有这个:
<input type="button" value="add" (click)="addEnvVar()"/>
<div *ngFor="let envVar of application.env_vars">
<input type="text" name="key" [(ngModel)]="envVar.key">
<input type="text" name="value" [(ngModel)]="envVar.value">
</div>
Run Code Online (Sandbox Code Playgroud)
背后的代码addEnvVar():
this.application.env_vars.push({key:'', value:''});
初始化组件时,内部有一个对象env_vars,它被渲染得很好(<input>填充了字段).单击"添加"后,我可以在控制台中看到env_vars中确实有两个对象(第二个是我刚添加的'空'对象),在视图中确实有两个<div>s envVar,但是所有4个 <input>字段是空的.
我究竟做错了什么?
UPDATE
我认为问题在于,当ngFor生成多个div输入时,每个输入div都获得相同的硬编码name属性(在我的情况下 - "key"和"value"),并且值以某种方式附加到该属性.我改name="key"到name="key_{{i}}"(i是一个模板变量持有ngForindex属性).
问题是,这是要走的路吗?还是我还缺少什么?
出现此类错误的罪魁祸首很可能是trackBy跟踪引用的默认函数。即使数据没有改变,但引用发生了变化,它也会拆除 DOM 并重新构建它,这意味着输入字段中的所有数据都将被清除。
trackBy(index) { return index }
Run Code Online (Sandbox Code Playgroud)
*ngFor="let envVar of application.env_vars; trackBy: trackBy"
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果没有复制品,我无法对其进行测试。然而,JB Nizet 的评论是正确的,你应该遵循这个建议;这是一项更适合反应式表单而不是模板表单的任务。
| 归档时间: |
|
| 查看次数: |
2144 次 |
| 最近记录: |