【问题标题】:Blank Chart When Parsing Data From Async Function in Angular从Angular中的异步函数解析数据时的空白图表
【发布时间】:2020-06-19 21:52:33
【问题描述】:

当我想解析来自 http 调用的数据并将其解析为位于 ngoninit 的图表数据时遇到问题。页面重新加载时,图表显示空白数据。你能帮我解决这个问题吗?我正在使用 Chartist.js 和 Angular 4。

html:

<div class="col-md-4">
                <lbd-chart 
                  [title]="'Email Statistics'"
                  [subtitle]="'Last Campaign Performance'"
                  [chartClass]="'ct-perfect-fourth'"
                  [chartType]="emailChartType"
                  [chartData]="emailChartData"
                  [legendItems]="emailChartLegendItems"
                  [withHr]="true"
                  [footerIconClass]="'fa fa-clock-o'"
                  [footerText]="'Campaign sent 2 days ago'">
                </lbd-chart>
            </div>

ngOnInit:

 async ngOnInit() {
    console.log('Halo from ngOnInit');
    const data1 = await this.serviceDashboard.getAllGeografika().toPromise();
    const data2 = await this.serviceDashboard.getAllHistorika().toPromise();
    const data3 = await this.serviceDashboard.getAllKeramologika().toPromise();


    this.data1 = data1.length;
    this.data2 = data2.length;
    this.data3 = data3.length;

    this.emailChartType = ChartType.Pie;
    this.emailChartData = {

      series: [this.data1, this.data2, this.data3]
    };

    this.emailChartLegendItems = [
      { title: 'Open', imageClass: 'fa fa-circle text-info' },
      { title: 'Bounce', imageClass: 'fa fa-circle text-danger' },
      { title: 'Unsubscribe', imageClass: 'fa fa-circle text-warning' }
    ];
}

【问题讨论】:

  • 如果我是正确的,您正在使用数字数组设置您的emailChartData。这真的是你想要的吗?
  • which get from http call ...你能console.log()将结果包含在你的问题中吗?
  • 是的,我想在 html 中打印 emailChartData 结果

标签: javascript angular async-await dom-events angular-promise


【解决方案1】:

1) 我更喜欢 rxjs 而不是 async/await 范例。

ngOnInit() {
    console.log('Halo from ngOnInit');
    const data1$ = this.serviceDashboard.getAllGeografika();
    const data2$ = this.serviceDashboard.getAllHistorika();
    const data3$ = this.serviceDashboard.getAllKeramologika();

    this.chartContext$ = combineLatest([data1$, data2$, data3$])
                        .pipe(
                           map(([d1, d2, d3]) => {
                               return {
                                 emailChartType: ChartType.Pie,
                                 emailChartData: [d1, d2, d3],
                                 emailChartLegendItems = [
                     { title: 'Open', imageClass: 'fa fa-circle text-info' },
                     { title: 'Bounce', imageClass: 'fa fa-circle text-danger' },
                     { title: 'Unsubscribe', imageClass: 'fa fa-circle text-warning' }
                                 ]
                               }
                             }
                           )
                        )
}

// And template

<div class="col-md-4">
  <lbd-chart 
     *ngIf="chartContext$ | async as chart"
     [title]="'Email Statistics'"
     [subtitle]="'Last Campaign Performance'"
     [chartClass]="'ct-perfect-fourth'"
     [chartType]="chart.emailChartType"
     [chartData]="chart.emailChartData"
     [legendItems]="chart.emailChartLegendItems"
     [withHr]="true"
     [footerIconClass]="'fa fa-clock-o'"
     [footerText]="'Campaign sent 2 days ago'">
   </lbd-chart>
</div>

2) 无论如何 1) 也许不会帮助你。 Chartist.js 和 Angular 4?您可能应该考虑更好的图表库和当前 (9) 版本的 Angular。 D3.js 从来没有让任何人失望过(但你必须创建自己的图表组件:-))

3) 您是否尝试过只在图表中放入虚拟数据而不查询 API 并查看它是否有效?

【讨论】:

  • 选项 1 不起作用。我想只打印数据的长度,所以它可以直接显示在饼图中。你有什么选择吗?
  • 一开始就在模板中打印出来...
    {{data | json}}
    // 在我的例子中它是 {{chartContext$ |异步 | json}}
  • 您确定数据正确流向您的模板吗?他们真的在那里吗?
猜你喜欢
  • 2020-06-18
  • 2018-08-12
  • 1970-01-01
  • 2018-02-17
  • 2013-08-02
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多