Firebase / MomentJS不一致的价值观

时间:2018-02-26 00:30:44

标签: javascript firebase momentjs

我有这个:

  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.Startsmeeting.Ends值在被moment.tz解析后会保留。

因此,假设首次订阅meeting.Starts11:00。执行meeting.Starts = moment.tz...之后会产生13:00,然后下次在firebase端发生任何事情并触发订阅时,Starts的值变为15:00,假设时区加2小时。

(firebase中的值是正确的......)发生了什么?

1 个答案:

答案 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');
        })
      ));
    });
}