【发布时间】:2018-04-01 10:43:51
【问题描述】:
我创建了一个 angular 2 组件,我在 *ngFor 指令中使用它,并且似乎每个实例都调用了两次构造函数。
所以如果我有 2 条记录返回到我的集合中,我的组件的构造函数会输入 4 次。如果我有三个构造函数被触发 6 次。
这给我带来了问题,因为我在构造函数中订阅 RxJs 可观察对象,因此我的事件在重复时被执行,因此在处理删除事件时,代码试图多次删除相同的记录,因此在第一次(成功)之后失败打电话。
代码结构如下:
最外层组件
<div class="list-row-container" *ngFor="let holiday of holidays">
<div style="border:1px; border-style: solid; margin: 5px;">
<div style="margin: 5px;">
<extended-inline-edit actionClass="fa-calendar"
[entityId]="holiday.id">
<holiday-view-body view-body [holiday]="holiday"></holiday-view-
body>
<holiday-edit-body edit-body [holiday]="holiday" [venueId]="venueId"
[year]="year"></holiday-edit-body>
</extended-inline-edit>
</div>
</div>
</div>
我受影响的组件是 holiday-edit-body 组件,它被嵌入到托管它的 extended-inline-edit 组件中(不知道如果嵌入会影响构造函数被触发的次数?)
我的集合填充在最外层组件的 ngOnInit 中,holidays.ts 如下:
ngOnInit() {
this.holidayService.getVenueHolidayInheritanceIndicator(this.venueId).then((data) => {
this.inheritFromAccount = data.sameAsAccount;
if (this.inheritFromAccount === false) {
this.loadVenueHolidays();
} else {
this.loadAccountHolidays();
}
});
}
loadVenueHolidays() {
this.holidayService.getVenueHolidays(this.venueId, this.year).then((data) => {
this.holidays = data;
});
}
【问题讨论】:
-
您是否尝试将订阅可观察对象移动到
ngOnInit? -
请添加如何初始化/更新
holidays的代码。 -
感谢 zgue,我离开了 ngInit,因为我认为这可能是我的问题,所以在那里发生了。
-
this.holidays(或data)是什么类型? -
所以我返回了几步,发现更高的另一个组件通过@ViewChild 属性引用了我的holiday.ts,并触发了导致集合的loadVenueHolidays() 方法刷新(使用相同的数据)从而更新组件两次?我现在的问题是,如何取消订阅我的数据刷新的 RxJs 事件处理程序?
标签: angular ngfor transclusion