【问题标题】:how to asynchronously update values in ng2-charts live through firebase如何通过firebase实时异步更新ng2图表中的值
【发布时间】:2017-03-27 07:45:12
【问题描述】:

我对 angular2 完全陌生。我的问题是我通过 ng2-charts lib 创建了一个条形图,并使用 angularfire2 将其链接到 firebase。 我有 2 个组件和一个服务,用于向我的 firebase 数据库发送和接收数据。我能够通过我的data.service.ts将来自一个组件doctor-local.component.ts的数据发送到firebase并在我的doctor-expert.component.ts上接收它,并使这里的数据与firebase数据库中的值的变化保持同步,并在同一个组件中实时显示,使用(ngModelChange) 事件绑定。条形图也在这个组件中。

这是我的expert.component.tsdoctor-expert.component.html

import {Component} from '@angular/core';
import {DataService} from '../data.service';
import {FirebaseObjectObservable} from 'angularfire2';

@Component({
  selector: 'app-doctor-expert',
  templateUrl: './doctor-expert.component.html',
  styleUrls: ['./doctor-expert.component.css']
})
export class DoctorExpertComponent {
  public items: FirebaseObjectObservable<any>;
  
  public barChartOptions: any = {
    scaleShowVerticalLines: false,
    responsive: true
  };
  public barChartLabels: string[] = ['RBC Count', 'WBC Count', 'Haemoglobin'];
  public barChartType: string = 'bar';
  public barChartLegend: boolean = true;
  rbc: number;
  wbc: number;
  haemo: number;


  public barChartData: any[] = [
    {data: [75, 59, 80], label: 'Current Count'},
    {data: [28, 48, 40], label: 'Average Normal Count'}
  ];

  constructor(private dataService: DataService) {
    this.items = this.dataService.messages;
    this.items.subscribe(data => {
      this.rbc = parseInt((data.rbccount), 10);
      this.wbc = parseInt((data.wbccount), 10);
      this.haemo = parseInt((data.haemocount), 10);
    });
    this.barChartData = [
      {data: [this.rbc, this.wbc, this.haemo], label: 'Current Count'},
      {data: [50, 50, 50], label: 'Average Normal Count'},
    ];
  }

  
  public chartClicked(e: any): void {
    console.log(e);
  }

  public chartHovered(e: any): void {
    console.log(e);
  }
}
<ul class="list-group container">
  <li class="list-group-item">RBC Count: {{(items | async)?.rbccount}} </li>
  <li class="list-group-item">WBC Count: {{(items | async)?.wbccount}} </li>
  <li class="list-group-item">Haemoglobin Count: {{(items | async)?.haemocount}} </li>
</ul>

<div class="container">
  <div style="display: block">
    <canvas baseChart
            [datasets]="barChartData"
            [labels]="barChartLabels"
            [options]="barChartOptions"
            [legend]="barChartLegend"
            [chartType]="barChartType"
            (chartHover)="chartHovered($event)"
            (chartClick)="chartClicked($event)"></canvas>
  </div>
</div>

这是我的data.service.ts

import {Injectable} from '@angular/core';
import 'rxjs/Rx';
import {AngularFire, FirebaseObjectObservable} from 'angularfire2';

@Injectable()
export class DataService {
  public messages: FirebaseObjectObservable<any>;

  constructor( public af: AngularFire ) {
    this.messages = this.af.database.object('data');
  }


  sendData(value1, value2, value3) {
    const message = {
      rbccount: value1,
      wbccount: value2,
      haemocount: value3
    };
    this.messages.update(message);
  }

  sendrbc(value){
    const message = {
      rbccount: value
    };
    this.messages.update(message);
  }

  sendwbc(value2){
    const message = {
      wbccount: value2
    };
    this.messages.update(message);
  }

  sendhaemo(value3){
    const message = {
      haemocount: value3
    };
    this.messages.update(message);
  }
}

"this.items = this.dataService.messages" 从数据库中接收代码,subscribe 方法从 observable 中获取值。现在我想更新在 barChartData 中收到的这个值,并使其与数据库中的更改保持同步。这样每次通过doctor-local.component.ts的数据发生变化时,数据库和条形图都会立即发生变化。我尝试在构造函数本身中这样做,但数据根本不显示在条形图中,更不用说不断更​​新了。

【问题讨论】:

    标签: angular firebase ng2-charts


    【解决方案1】:

    我做了一些挖掘,并想出了这个非常直接的解决方案。 问题是数据集是异步加载的,并且在初始化时正在渲染图表,这就是它无法加载到达的新数据的原因。

    解决方法是等到异步完成后再绘制画布。在您的组件中:

    isDataAvailable:boolean = false; ngOnInit() { asyncFnWithCallback(()=>{ this.isDataAvailable = true}); }

    asyncFnWithCallback() 是你的函数。

    然后在您的 html 中,将整个图表模板包装为:

    <div *ngIf="isDataAvailable"> . . . chart canvas + any other template code . . . </div>

    在这种情况下,对于doctor-expert.component.ts,新代码如下所示:

    import {Component, OnInit} from '@angular/core';
    import {DataService} from '../data.service';
    import {FirebaseObjectObservable} from 'angularfire2';
    
    @Component({
      selector: 'app-doctor-expert',
      templateUrl: './doctor-expert.component.html',
      styleUrls: ['./doctor-expert.component.css']
    })
    export class DoctorExpertComponent{
      public items: FirebaseObjectObservable<any>;
    
      public barChartOptions: any = {
        scaleShowVerticalLines: false,
        responsive: true
      };
      public barChartLabels: string[] = ['RBC Count', 'WBC Count', 'Haemoglobin'];
      public barChartType: string = 'bar';
      public barChartLegend: boolean = true;
      rbc: number;
      wbc: number;
      haemo: number;
    
    
      public barChartData: any[] = [];
    
      isDataAvailable: boolean = false;
    
      constructor(private dataService: DataService) {
        this.items = this.dataService.messages;
        this.items.subscribe(data => {
          this.rbc = parseInt((data.rbccount), 10);
          this.wbc = parseInt((data.wbccount), 10);
          this.haemo = parseInt((data.haemocount), 10);
          this.barChartData = [
            {data: [this.rbc, this.wbc, this.haemo], label: 'Current Count'},
            {data: [50, 50, 50], label: 'Average Normal Count'},
          ];
          this.isDataAvailable = true;
        });
      }
    
    
      public chartClicked(e: any): void {
        console.log(e);
      }
    
      public chartHovered(e: any): void {
        console.log(e);
      }
    }

    doctor-expert.component.html 看起来像这样:

    <ul class="list-group container">
      <li class="list-group-item" (ngModelChanges)="update($event)">RBC Count: {{(items | async)?.rbccount}} </li>
      <li class="list-group-item" (ngModelChanges)="update($event)">WBC Count: {{(items | async)?.wbccount}} </li>
      <li class="list-group-item" (ngModelChanges)="update($event)">Haemoglobin Count: {{(items | async)?.haemocount}} </li>
    </ul>
    
    <div class="container" *ngIf="isDataAvailable">
      <div style="display: block">
        <canvas baseChart
                [datasets]="barChartData"
                [labels]="barChartLabels"
                [options]="barChartOptions"
                [legend]="barChartLegend"
                [chartType]="barChartType"
                (chartHover)="chartHovered($event)"
                (chartClick)="chartClicked($event)"></canvas>
      </div>
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多