Angular Firestore извлекает одну запись и извлекает их все после обновления - PullRequest
0 голосов
/ 18 мая 2019

У меня есть веб-приложение Ionic - Angular, которое позволяет пациентам в больнице отправлять запросы медсестрам, и медсестры могут регистрировать запрос как выполненный после его завершения.У меня есть страница аналитики, на которой я в настоящее время показываю одну диаграмму с chart.js - средним временем завершения (в минутах) по Nurse.To, для этого в ngOnInit я выбираю всех пользователей из моей коллекции пользователей в Firestore, если их поле типа равно 'п '(медсестра).После этого я получаю все запросы, которые выполнены.Позже, в цикле, для каждой медсестры я делаю среднее вычисление времени для завершения.

Когда я запускаю приложение и захожу в систему, когда я получаю доступ к странице Google Analytics, кажется, что при подписке загружается только одна медсестра.(тот, кто в данный момент вошел в систему), поэтому на графике отображается только столбик этой медсестры.В консоли я вижу, что сначала он выбирает одну медсестру, но позже он выбирает снова, на этот раз со всеми медсестрами, но диаграмма не обновляется.

Когда я обновляю страницу, диаграмма устанавливаетсякак и должно быть.

Странная вещь в том, что когда он выбирает только одну медсестру, это всегда медсестра, которая в данный момент вошла в систему, даже если в моем коде нет ничего, чтобы расставить приоритеты для этого пользователя.

Файл аналитики .ts файл:

    import { Component, OnInit, ViewChild } from '@angular/core';
import { Observable } from 'rxjs';
import {
  AngularFirestoreCollection,
  AngularFirestore
} from '@angular/fire/firestore';
import { Users } from '../users/users.model';
import { Chart } from 'chart.js';
@Component({
  selector: 'app-analytics',
  templateUrl: './analytics.page.html',
  styleUrls: ['./analytics.page.scss']
})
export class AnalyticsPage implements OnInit {
  data: Observable<any[]>;
  ref: AngularFirestoreCollection<any>;
  nurseRef: AngularFirestoreCollection<any>;
  nurses: Users[];
  @ViewChild('valueBarsCanvas') valueBarCanvas;
  valueBarsChart: any;

  chartData = null;

  constructor(private firestore: AngularFirestore) {}

  ngOnInit() {
    // get Nurses list
    this.nurseRef = this.firestore.collection('added-users', ref =>
      ref.where('type', '==', 'n')
    );
    this.nurseRef.valueChanges().subscribe(result => {
      this.nurses = result;
    });

    // get Completed Requests
    this.ref = this.firestore.collection('requests', ref =>
      ref.where('status', '==', 'Completed')
    );
    this.ref.valueChanges().subscribe(result => {
      if (this.chartData) {
        console.log('true ', result);
        this.updateCharts(result);
      } else {
        console.log('false ', result);
        this.createCharts(result);
      }
    });
  }

  getReportValues() {
    let reportByNurse = {};
    let millisecondsPerHour = 1000 * 60 * 60;
    let counter;
    let sum;
    let avg;
    for (let nurse of this.nurses) {
      counter = 0;
      sum = 0;
      for (let request of this.chartData) {
        if (request.nurseName === nurse.name) {
          counter += 1;
          sum +=
            (request.completionDate.toDate() - request.date.toDate()) /
            millisecondsPerHour;
        }
      }
      avg = sum / counter;
      reportByNurse[nurse.name] = avg;
    }
    return reportByNurse;
  }

  async createCharts(data) {
    this.chartData = data;
    console.log('chart data is: ' + this.chartData);
    let colors = [];
    let i = 0;
    let chartData = await this.getReportValues();
    console.log('new chart data is: ' + chartData);
    while (i < this.getObjectSize(chartData)) {
      colors.push(this.getRandomColor());
      i += 1;
    }
    this.valueBarsChart = new Chart(this.valueBarCanvas.nativeElement, {
      type: 'bar',
      data: {
        labels: Object.keys(chartData),
        datasets: [
          {
            data: Object.values(chartData),
            backgroundColor: colors
          }
        ]
      },
      options: {
        legend: {
          display: false
        },
        scales: {
          yAxes: [
            {
              ticks: {
                beginAtZero: true
              }
            }
          ]
        }
      }
    });
  }

  async updateCharts(data) {
    this.chartData = data;
    let chartData = await this.getReportValues();

    this.valueBarsChart.data.datasets.forEach(dataset => {
      dataset.data = Object.values(chartData);
    });
    this.valueBarsChart.update();
  }

  getRandomColor() {
    let letters = '0123456789ABCDEF'.split('');
    let color = '#';
    for (var i = 0; i < 6; i++) {
      color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
  }

  getObjectSize(obj: {}) {
    let size = 0,
      key;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) {
        size++;
      }
    }
    return size;
  }
}

This is the result when first load

This is the accurate result when I refresh the app(in browser)

...