Я полностью подозреваю, что это происходит из-за конфликта в значении атрибута name
.Только для этого случая, если вы splice
newItem
в первом месте, он только добавляет эту переменную, а другие DOM не рендерится.Для перекрестной проверки вы можете попробовать заменить элемент input
простой привязкой, такой как {{classData.title}}
, и все работает отлично.
Такое поведение легко можно решить, не конфликтуя со значением атрибута name
за все время.Это означает, что для каждого элемента коллекции назначается уникальная переменная id
.
this.classesData = [
{ id: 1, title: 'Hello0' },
{ id: 2, title: 'Hello1' },
{ id: 3, title: 'Hello2' }
];
duplicate() {
const newData = JSON.parse(JSON.stringify(this.classesData[1]));
newData.title += 'Copy';
newData.id = Date.now()
this.classesData.splice(1, 0, newData);
}
Шаблон
<div *ngFor="let classData of classesData;let i=index">
<input [(ngModel)]="classData.title" [name]="'title_'+classData.id" type="text">
</div>
Stackblitz
То же самое можно проверить, удалив атрибут name
из каждого поля ввода.Но этого будет недостаточно, будет выдано
Ошибка: если в теге формы используется ngModel, должен быть установлен атрибут имени или элемент управления формы должен быть определен как «автономный» в ngModelOptions.
Поэтому добавьте [ngModelOptions]="{standalone: true}"
в каждое поле ввода, чтобы ввод работал без атрибута name
.Как предложено в другом ответе @briosheje, вы также можете усилить рендеринг, используя trackBy
.
PS: я исследую, почему это работает иначе, когда есть комбинация name
и input
Я подозреваю о проводке API form
с элементом input
.Я обновлю ответ, как только получу что-нибудь.