angular - Angular NgOnChanges 行为怪异
问题描述
我有一个父组件通过输入向子组件发送数据。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
};
但它的行为仍然出乎意料。
解决方案
您可以尝试围绕输入元素上的变量创建一个设置器。在你的子元素中,做
private _schedule: any;
@Input('sendScheduleToChild')
set sendScheduleToChild(schedule: any) {
this._schedule = schedule;
}
在您的父组件视图中,只需执行
<childComponent [sendScheduleToChild]="{value}"></childComponent>
ngOnChanges 应该能够在此之后捕获更改。
推荐阅读
- linux - 操作系统如何知道向哪个进程发送键盘中断?
- c# - 将 varchar 值“Batsman”转换为数据类型 int 时转换失败
- c++ - 使用类模板范围内的枚举而不指定模板参数
- javascript - 在 for 循环中超时获取
- python - Python 中基于梯度的优化
- sql - Postgresql 使用 ILIKE 搜索非 ascii 字符
- geojson - GDALException OGR 失败
- c# - 是否可以在 EF Core Include 查询中加入不相关的表
- python - pandas 风格高亮格式的分步说明是什么?
- xcode - 我可以用一些模板自动填充 Xcode 的提交消息吗?