【问题标题】:ngModel does not update value on changengModel 不会在更改时更新值
【发布时间】:2018-04-23 11:54:43
【问题描述】:

我有 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

【问题讨论】:

  • 试试这个 HTML
  • 您正在通过index 进行跟踪,这就是ngFor 不重新渲染text 的原因,您可以尝试更改为return index + obj.text;
  • @PankajParkar 不起作用。
  • 你的方法调用中的comment.answers是什么?
  • @PardeepJain 这是我在 ngFor 循环中得到的对象,我更新了有问题的代码。

标签: angular typescript ngmodel


【解决方案1】:

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"

【讨论】:

  • 但如果我还需要获取项目密钥?
  • 我更新了答案和the stackblitz,其中包含数组中的键。
猜你喜欢
  • 2020-05-18
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2018-07-15
相关资源
最近更新 更多