Это потому, что ngFor
работает внутри. Как только ссылка отслеживаемого элемента изменится, ngFor
выполнит его повторную визуализацию.
Поскольку javascript не сохраняет ссылки на примитивы в стеке, но значение непосредственно, каждое изменение значения будет изменять значение на стек и, следовательно, ngFor
будет повторно визуализировать ваш объект.
Таким образом, если вы оберните его в объект и измените только значения объектов, изменение ссылки не будет, и поэтому ваше решение работает.
Однако, чтобы предотвратить это, Angular предлагает trackByFn . Эта функция позволяет вам определить уникальный идентификатор для ваших объектов, и если идентификатор остается прежним, ваш объект не будет перерисован, даже если ссылка / значение изменятся. Поэтому я думаю, что вам лучше всего использовать индекс в качестве уникального идентификатора:
Машинопись:
trackItem(index:number,item:string){
return index;
}
HTML:
<div [@inOutAnimation] *ngFor="let val of list; index as i;trackBy:trackItem" class="form-field">
<mat-form-field >
<mat-label>At</mat-label>
<input matInput [(ngModel)] = "list[i]">
</mat-form-field>
<button mat-icon-button class="add-shift-btn" (click)="removeShift(i)">
<mat-icon aria-hidden="false" aria-label="Example home icon">delete</mat-icon>
</button>
</div>