我有这个:
init(userId: string = this.authProvider.currentUserId) {
this._subscription.add(this.db.list(`meetings/${userId}`)
.subscribe((meetings: any[]) => {
this._meetings = meetings.map((meeting) => {
meeting.Date = meeting.Date;
meeting.Ends = moment.tz(meeting.Ends, 'HH:mm', meeting.Location.TimeZone).local().format('HH:mm');
meeting.Starts = moment.tz(meeting.Starts, 'HH:mm', meeting.Location.TimeZone).local().format('HH:mm');
return Meeting.Parse(meeting);
});
}));
}
对于来自firebase的任何更改,meeting.Starts
,meeting.Ends
值在被moment.tz解析后会保留。
因此,假设首次订阅meeting.Starts
为11:00
。执行meeting.Starts = moment.tz...
之后会产生13:00
,然后下次在firebase端发生任何事情并触发订阅时,Starts
的值变为15:00
,假设时区加2小时。
(firebase中的值是正确的......)发生了什么?
答案 0 :(得分:1)
您似乎正在使用AngularFire2。
问题是您正在改变列表中的项目。发生更改时,AngularFire2仅更新受更改影响的项目。但是,您正在改变所有项目 - 因此moment.tz
将重新应用于任何未更改的项目。
一种解决方案是不要改变项目:
init(userId: string = this.authProvider.currentUserId) {
this._subscription.add(this.db.list(`meetings/${userId}`)
.subscribe((meetings: any[]) => {
this._meetings = meetings.map(meeting => Meeting.Parse({
...meeting,
Ends: moment.tz(meeting.Ends, 'HH:mm', meeting.Location.TimeZone).local().format('HH:mm'),
Starts: moment.tz(meeting.Starts, 'HH:mm', meeting.Location.TimeZone).local().format('HH:mm');
}));
});
}
或者,没有spread属性语法:
init(userId: string = this.authProvider.currentUserId) {
this._subscription.add(this.db.list(`meetings/${userId}`)
.subscribe((meetings: any[]) => {
this._meetings = meetings.map(meeting => Meeting.Parse(
Object.assign({}, meeting, {
Ends: moment.tz(meeting.Ends, 'HH:mm', meeting.Location.TimeZone).local().format('HH:mm'),
Starts: moment.tz(meeting.Starts, 'HH:mm', meeting.Location.TimeZone).local().format('HH:mm');
})
));
});
}