我有一个父组件通过输入向子组件发送数据。NgOnChanges 不会像我预期的那样工作。我知道它不适用于对象/数组,因为它们是通过引用发送的,因此 Angular 无法检测到更改。
因此,我尝试了使用 Object.assign() 将其分配给新对象以创建新引用的解决方法,但它不起作用。
家长 TS:
public selectSchedule(index) {
this.oldWeeklyScheduleSelected = this.weeklyScheduleSelected;
if (index != this.weeklyScheduleSelected) {
this.weeklyScheduleSelected = index;
this.selectedActivity = undefined;
}
this.http.getDefaultWeekPlanning(this.idOrganisation, this.userId, this.weeklyScheduleCreated[index]
).subscribe((data: any) => {
if (data === undefined || data.length === 0) {
this.sendScheduleToChild.scheduleSlot = [];
} else {
this.sendScheduleToChild.scheduleSlot = data;
this.sendScheduleToChild.existingSchedule = true;
this.sendScheduleToChild = Object.assign({}, this.sendScheduleToChild);
console.log(this.sendScheduleToChild.scheduleSlot);
}
}
}
儿童 TS:
@Input() sendScheduleToChild: any;
ngOnChanges(changes: SimpleChanges) {
console.log(changes)
if (this.oldWeeklyScheduleSelected != this.weeklyScheduleSelected && this.oldWeeklyScheduleSelected != undefined) {
this.daysOfWeek.forEach(e => {
e.scheduleSlot = [];
});
this.scheduleOfEachDay();
} else {
this.scheduleOfEachDay();
}
if (this.sendScheduleToChild.existingSchedule === true && this.sendScheduleToChild.scheduleSlot.length === 0) {
this.hoursOfDayDisplay(this.editAgenda);
}
}
oldWeeklyScheduleSelected 和 weekScheduleSelected 效果很好,因为它们是数字。
sendScheduleToChild 在第一次点击时不会。但它会在之后的第二个,但我的数据会在那个时候搞砸。
console.log(changes) 显示已更改的变量,但在 sendScheduleToChild 的情况下,先前值和当前值都相同,而其他两个则不同。
我不明白为什么它一开始没有检测到更改,但由于发送的数据属于同一类型,所以单击 2 次后会检测到更改。
任何帮助表示赞赏。
PS:
我试图通过更改值来修改对象的引用:
if (data === undefined || data.length === 0) {
this.sendScheduleToChild.scheduleSlot = [];
} else {
this.sendScheduleToChild = {
scheduleSlot: data,
existingSchedule: true
};
但它的行为仍然出乎意料。