Angular 6 - ngModel в ngFor обновляет каждый элемент в массиве

Я начал изучать Angular 6 пару недель назад, так что я все еще новичок в этом.

Я пытался обновить поля двустороннего связывания в массиве объектов.

Вот мой массив, инициализированный в

store.component.ts:

store_list = [{
    Address1: 'add1',
    Address2: 'test',
    City: ''
},{Address1: 'aaaa',
    Address2: 'bbbb',
    City: 'cccc'}];

    trackStore(index: number, obj: any): any {
    return index;
}

store.component.html:

<div *ngFor="let store of store_list; let i=index; trackBy: trackStore;">
  <mat-card class="store-card" mat-elevation-z8>
     <mat-card-content>
      <form class="example-form">
        <mat-form-field class="address-street">
          <input matInput [(ngModel)]="store_list[i].Address1" placeholder="Street Address" name="store.{{i}}.address1" required>
        </mat-form-field>            
        <mat-form-field class="address-street">
          <input matInput [(ngModel)]="store.Address2" placeholder="Address Line 2" name="store.{{i}}.address2" required>
        </mat-form-field>
       </form>
     </mat-card-content>
  </mat-card>
</div>

Я пробовал связать два разных способа с ngModel, чтобы посмотреть, сработает ли один из них. Однако они оба ведут себя одинаково.

Когда у меня есть массив из 3 хранилищ и я обновляю Address 1 или Address 2 в ЛЮБОМ одном из этих хранилищ, все 3 поля хранилища Address 1 обновляются.

Большая часть онлайн-исследований привела к 3 решениям, ни одно из которых пока не сработало.

  1. Включите индекс в атрибут «name», чтобы получить уникальное имя поля.
  2. Используйте trackBy, я также пробовал использовать уникальный идентификатор в массиве store_list и возвращать его через пользовательскую функцию trackBy, но это не сработало.
  3. Не используйте ngModel в ngFor.

person Sung Chae    schedule 16.05.2018    source источник
comment
Попробуйте удалить атрибут имени во входном теге и использовать только. Только [(ngModel)]="store.Address1". Потому что [(ngModel)] содержит сам атрибут name.   -  person Sanoj_V    schedule 16.05.2018
comment
Я попробовал это и получил следующую ошибку: если ngModel используется в теге формы, либо должен быть установлен атрибут name, либо элемент управления формы должен быть определен как «автономный» в ngModelOptions. Пример 1: ‹input [(ngModel)] = person.firstName name = first› Пример 2: ‹input [(ngModel)] = person.firstName [ngModelOptions] = {standalone: ​​true}› Я также попробовал {ngModelOptions] = { standalone: ​​true}, и ошибка исчезнет, ​​но при редактировании одной итерации все снова обновится.   -  person Sung Chae    schedule 16.05.2018
comment
Вы можете попробовать name="{{'store.'+i+'.address1'}}" это.   -  person Sanoj_V    schedule 16.05.2018
comment
вы уверены? не могу воспроизвести проблему, я создал stackblitz для этого stackblitz.com/edit/angular-cehugw   -  person John Velasquez    schedule 16.05.2018
comment
Я думаю, что внутри цикла есть тег формы, вызывающий ошибку, вы также можете попытаться установить атрибут Id, используя i в теге формы.   -  person Sanoj_V    schedule 16.05.2018
comment
вы хотите обновить все поле Address1 при обновлении одного поля Address1   -  person Sanoj_V    schedule 16.05.2018


Ответы (1)


Попробуйте это в цикле for и удалите trackby внутри * ngFor: <input matInput [(ngModel)]="store.Address1" placeholder="Street Address" required> Потому что [(ngModel)] содержит сам атрибут name. См. Документацию здесь: (angular.io/api/forms/NgModel)

person Sanoj_V    schedule 16.05.2018