【问题标题】:AngularFire2 Firestore Dynamic Query: where startTime == currentDateRangeAngularFire2 Firestore 动态查询:其中 startTime == currentDateRange
【发布时间】:2023-04-01 19:16:01
【问题描述】:

AngularFire2 和 Firestore

目标:从 Firestore 中查询 startTime == currentDateRange 的数据

问题:Firestore 中的动态查询遇到问题。我通读了documentation 并查看了提供的example。我的 Firestore 中存储了每周课程,即(第 1 课、第 2 课、第 3 课等)。它们每个都有一个 starTime(timestamp)(2017 年 12 月 18 日、2017 年 12 月 25 日、2018 年 1 月 1 日)。

我的目标是让我的网页只为我的学生显示给定一周的当前课程材料。每周课程将在周一 00:00(周日午夜)至周日 23:59(七天日期范围)显示。

然后,当新的一周在星期一重新开始时,我会显示新课程,在此处的示例中,第 2 课 - 2017 年 12 月 25 日。不知道如何识别当前日期,然后添加日期范围,或者当天加上另外六天。

从 MySql 转移到 Firestore。所以对我来说还是很陌生。下面提供的是我迄今为止所做的工作(收效甚微)。 Firestore 数据结构、TypeScript 文件和 HTML 的图像。

第一次在 StackOverflow 上发帖,希望我遵循了正确的准则来提交这个问题。非常感谢您提供的任何帮助。

Firestore 数据

Firestore Data Structure

TS

import { Component } from '@angular/core';
import { AngularFirestore, AngularFirestoreDocument, AngularFirestoreCollection } from 'angularfire2/firestore';
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import 'rxjs/add/operator/switchmap'
import 'rxjs/add/observable/combineLatest';

export interface Week {
  lesson: string;
  startTime: Date;
}

@Component({
  selector: 'app-calendar',
  templateUrl: './calendar.component.html',
  styleUrls: ['./calendar.component.css'],
})

export class CalendarComponent {
  weeks: Observable<any[]>;
  dateFilter: BehaviorSubject<string | null>;
  currentDate: new Date();
  endDate: string;// need to figure out how to add seven days from currentDate

  constructor(private afs: AngularFirestore) {

    this.dateFilter = new BehaviorSubject(null);
    this.weeks = Observable.combineLatest(
      this.dateFilter).switchMap(([startTime]) => afs.collection<Week>('weeks', ref => {
      let query : firebase.firestore.CollectionReference | firebase.firestore.Query = ref;
      if (startTime) { query = query.where('startTime', '=>', currentDate) };
      if (startTime) { query = query.where('startTime', '<', endDate) };
      return query;
    }).valueChanges());
}

HTML

          <ul *ngFor="let week of weeks | async">
        <li >
          {{ week.lesson }}
        </li>
        <li>
          {{ week.startTime }}
        </li>
      </ul>

【问题讨论】:

    标签: typescript timestamp angularfire2 google-cloud-firestore


    【解决方案1】:

    最简单的方法是:

    endDate = startDate + 7*86400  // 7 days * 86400 ms in a day
    

    仅添加日期的问题是它没有考虑闰日等。

    在 Javascript 中处理日期的最佳方法是使用 moment.js 库。 以下是如何验证日期(如果需要)然后添加 1 周以获取结束日期的示例。

     if (!moment(this.activity.dates.startDate).isValid())
          this.activity.dates.startDate = moment().toISOString();
        if (!moment(this.activity.dates.endDate).isValid())
          this.activity.dates.endDate = moment().add(1, 'week').toISOString();
    

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 2018-07-07
      • 2018-10-25
      • 1970-01-01
      • 2019-01-16
      • 2018-10-15
      • 2019-04-08
      • 1970-01-01
      相关资源
      最近更新 更多