У меня есть родительский компонент с массивом объектов.
Я использую * ngFor l oop для заполнения дочерних компонентов через @Input () с элементом в каждом индексе.
Если я изменяю объект по индексу, дочерний компонент полностью сбрасывается, вместо того, чтобы просто принять новый ввод и сохранить его другие свойства.
TypeScript:
export interface MyObject {
a: string;
b: string;
}
export class Parent {
objectArray: MyObject[] = [
{a: 'string A', b: 'string B'}
];
changeAnObject() {
const sameObject: MyObject = {a: 'string A', b: 'string B'};
this.objectArray[0] = sameObject;
}
}
export class Child {
@Input() inputObject: MyObject;
selected = false; // Some other property to maintain
}
Родительский HTML:
// 3 different ways to populate inputObject
<div *ngFor="let object of objectArray">
<app-child [inputObject]="object"></app-child> // does not maintain "selected" property
</div>
<div *ngFor="let object of objectArray; let index = index">
<app-child [inputObject]="objectArray[index]"></app-child> // does not maintain "selected" property
</div>
<div>
<app-child [inputObject]="objectArray[0]"></app-child> // DOES maintain "selected" property
</div>
<button (click)="changeAnObject()">Change Object</button>
Дочерний HTML:
<div (click)="selected = !selected">
a: {{inputObject.a}}
b: {{inputObject.b}}
SELECTED: {{selected}}
</div>
Результат
В родительском HTML, [inputObject]="objectArray[0]"
- единственное найденное мной решение, которое поддерживает другие свойства Child при изменении элемента в objectArray[0]
.
Это недостаточно для меня, так как у меня есть много объектов для отображения .
Есть ли лучший способ отправить данные в Компоненты без их полной перезагрузки? Я попытался использовать Angular Accessors
с @Input() set inputObject {...}
, но это не помогло сохранить свойства компонента. То есть конструктор снова выполняется при изменении inputObject
, возвращая все свойства к значениям по умолчанию.