Ng-модель не обновляет объект из входного тега (внутри ngFor с каналом keyvalue)

#angular #key-value #ngmodel

#angular #ключ-значение #ngmodel

Вопрос:

У меня есть объект JSON, ключи которого являются случайными, но в этом случае я буду использовать Id и Name в качестве примера:

{Id: "someID", Name: "some name"}

И я пытаюсь отобразить каждый ключ и значение этого объекта, но разрешаю пользователю редактировать значение с помощью <input> тега.

 <div>
    <p *ngFor="let item of data | keyvalue">
        Key: {{item.key}}: <input [(ngModel)]="item.value">, {{item.value}}, {{data[item.key]}}</p>
</div>
  

Когда пользователь вносит изменения в поле ввода, ввод на экране изменяется (т.Е. item.value ) — но объект данных не обновляется (т.Е. data[item.key] ).).
Я могу использовать ngModelChange or (input)="onchange"($event, item.key)" или [(ngModel)]="data[item.key] для обновления объекта данных; однако это приводит к тому, что поле ввода теряет фокус, поэтому за один раз можно изменить только один символ.

Я полагаю, что проблема кроется где-то в канале keyvalue — поскольку у меня нет проблем с использованием предопределенных ключей ie. <input [(ngModel)]="data.id"> — но, очевидно, поскольку ключи внутри объекта являются случайными, я не могу это использовать.

Итак: есть ли способ использовать ngModel для обновления значения внутри объекта. Или есть какой-либо другой способ обновить значение объекта и отобразить его на экране и в поле ввода?

Ответ №1:

Изменения не отражаются в, data[item.key] потому что keyvalue канал возвращает новый массив новых объектов с теми же ключами, что и в исходных объектах. Это означает, что ngModel мутация не окажет никакого влияния на исходный data объект.

Ваше решение — использовать обозначение в квадратных скобках с trackBy опцией:

HTML

 <p *ngFor="let item of data | keyvalue; trackBy: trackByFn">
  Key: {{item.key}}: <input [(ngModel)]="data[item.key]">
        {{item.value}}, {{data[item.key]}}
</p>
  

ts

 trackByFn(item) {
  return item;
}
  

Пример Ng-run