我有ngModel,在ngFor循环中:
<div *ngFor="let comment of comments">
<div *ngFor="let answer of toArray(comment.answers); let j = index; trackBy: trackByIndex;">
<textarea id="editAnswer[j]" name="editAnswer[j]" [(ngModel)]="answer.text">
{{ answer.text }}
</div>
</div>
在我的组件中,我有两个函数用于索引迭代并将对象转换为数组:
trackByIndex(index: number, obj: any): any {
return index;
}
toArray(answers: object) {
return Object.keys(answers).map(key => ({
key,
...answers[key]
}))
}
但是当我更改文本在textarea中绑定的内容时,ngModel不会更改。
Stackblitz示例: https://stackblitz.com/edit/angular-z6xatv
答案 0 :(得分:3)
toArray
方法似乎正在创建原始comments.answers.text
值的副本。在输入元素中修改text
属性时,更改不会影响原始数据(this stackblitz中的控制台显示值未共享)。
如果您简化toArray
以便它返回answers
的简单数组,则代码可以正常工作(请参阅this stackblitz)。数组中的项与原始数据共享相同的text
引用。
comments = [
{
text: 'dsddsdsd', answers: {
FszW: { text: 'answer 1' },
dsSce: { text: 'answer 2' }
}
}
]
toArray(answers: object) {
return Object.keys(answers).map(key => answers[key]);
}
如果您需要访问密钥,可以使用此版本的toArray
:
toArray(answers: object) {
return Object.keys(answers).map(key => {
return { key: key, value: answers[key] };
});
}
使用以下模板标记:
<textarea name="answer_{{j}}" [(ngModel)]="answer.value.text"></textarea>
{{ answer.key }}: {{ answer.value.text }}
作为旁注,我建议使用以下语法之一在模板中设置name属性:
name="answer_{{j}}"
[name]="'answer_' + j"