ngModel 不会在更改时更新值
ngModel does not update value on change
我有 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
toArray
方法似乎正在创建原始 comments.answers.text
值的副本。在输入元素中修改text
属性时,修改不会影响原始数据(this stackblitz中的控制台显示值不共享)。
如果您简化 toArray
使其 returns 成为 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="answer_{{j}}"
[name]="'answer_' + j"
我有 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
toArray
方法似乎正在创建原始 comments.answers.text
值的副本。在输入元素中修改text
属性时,修改不会影响原始数据(this stackblitz中的控制台显示值不共享)。
如果您简化 toArray
使其 returns 成为 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="answer_{{j}}"
[name]="'answer_' + j"