Я пытаюсь распространить изменение от компонента к одному из его братьев и сестер через их родительский элемент через EventEmitter. Изменение касается статуса пользователя в массиве.
Вот мой код:
child1.component.ts (источник)
@Output() adminAdded = new EventEmitter<Array<AdminDetails>>();
...
setAdminStatus(index: number, status: string): void {
this.admins[index].status = status;
this.adminAdded.emit(this.admins);
}
parent.component.ts
onAdminAdded(adminDetails: Array<AdminDetails>): void {
Object.assign(this.adminDetails, adminDetails]);
}
parent.component.html
<child1-component (adminAdded) = "onAdminAdded($event)"></child1-component>
<child2-component [admins] = "adminDetails"></child2-component>
child2.component.ts
adminMails: string[];
@Input() set admins(admins: Array<AdminDetails>) {
if (!admins) {
return;
}
adminMails = admins.filter(x => x.status === 'Active').map(x => x.email);
}
а здесь я показываю электронные письма активных админов. Проблема в том, что изменение распространяется только на родительский компонент. Точка останова на Object.assign срабатывает, но не в сеттере.
Я предполагаю, что это потому, что ссылка на массив такая же, и он не распознает изменение. Любые идеи?



Вы правы, Angular обнаруживает изменения только при изменении ссылочного объекта, но не при изменении его содержимого.
Вы можете обойти это, переместив свою логику в ловушку жизненного цикла DoCheck, которая может обнаруживать изменения в свойствах объекта.
Редактировать
Как уже говорилось, если вы беспокоитесь о том, что DoCheck вызывается слишком часто, создание полностью нового объекта и переназначение его вашему свойству input должно помочь, поскольку ссылка будет другой.
Если вы беспокоитесь о том, что DoCheck вызывается слишком часто, создание совершенно нового объекта и переназначение его вашему свойству input должно помочь, поскольку ссылка будет другой.
@bugs Не могли бы вы отредактировать это в ответ, чтобы я мог согласиться?
@AnandG Спасибо, но я не хочу вводить совершенно новую услугу и накладные расходы на использование наблюдаемого только для отслеживания массива.
Отредактировал ответ
Я читал о крючке DoCheck, но, похоже, его часто называли настоящим. Нет возможности принудительно обновить свойство ввода?