【问题标题】:Why will my Kendo chart for angular render mock data but not real data?为什么我的剑道图表会渲染模拟数据而不是真实数据?
【发布时间】:2021-08-01 02:12:04
【问题描述】:

我正在尝试使用 Kendo Charts for Angular 渲染图表,但它不起作用。

首先,我用模拟数据进行了尝试,它成功了:

这是我的代码:

<kendo-chart>
    <kendo-chart-series>
      <kendo-chart-title text="Large Data"></kendo-chart-title>
      <kendo-chart-series-item
        type="scatterLine"
        [style]="'smooth'"
        [data]="largeData"
        yField="value"
        xField="date"
      >
      </kendo-chart-series-item>
    </kendo-chart-series>
    <kendo-chart-x-axis>
        <kendo-chart-x-axis-item [labels]="{ format: 'MMM d, yy - hh:mm:ss a', rotation: 'auto' }">
        </kendo-chart-x-axis-item>
    </kendo-chart-x-axis>
  </kendo-chart>

还有……

    const startDate = new Date('1/1/2019');
    for (let i = 0; i < 100; i++) {
      const date = new Date(JSON.parse(JSON.stringify(startDate)));
      date.setDate(startDate.getDate() + i);
      const value = Math.random() * 100;
      this.largeData.push({
        date,
        value
      });
    }

自从我开始工作后,我尝试了从后端获取实际数据的下一步,如下所示:

    this.readingClient
      .query(filter, orderBy, skip, top, select)
      .pipe(retry(1))
      .subscribe((response) => {
        response.data.forEach(d => {
          this.largeData.push({
            date: d.readingDate,
            value: d.readingValues?.aCMitigationAmps?.value
          });
        });
      });

...但它不渲染:

这是从后端返回的 largeData 中的数据示例:

我认为日期有问题。请注意,日期轴是 0, 0, 0, 1, 1, 1 ... 即使我告诉它将日期格式化为'MMM d, yy - hh:mm:ss a'。此外,如果我删除格式并添加 [baseUnit]="days" 我会得到 0、0.2、0.4、0.6 ... 一直到 1.2,这正是沿 y 轴的值(好像它使用相同的值两个轴)。

谁能看到我做错了什么。

【问题讨论】:

    标签: angular charts kendo-ui


    【解决方案1】:

    正如Documentation 建议的那样

    要触发更改检测,请为集合创建一个新数组实例——例如,设置 this.data = [...this.data 来代替 this.data.push({new item}) 数组, {new item}] 一个。

    这基本上意味着您需要使用从后端返回的新数组重新分配您的 largeData。也许试试:

    this.readingClient
      .query(filter, orderBy, skip, top, select)
      .pipe(retry(1))
      .subscribe((response) => {
        response.data.forEach(d => {
          const backendData = [];
          backendData.push({
            date: d.readingDate,
            value: d.readingValues?.aCMitigationAmps?.value
          });
          this.largeData = backendData
        });
      });
    

    【讨论】:

    • 谢谢贝卡,这很有效。但是只是为了我的理解,为什么我必须在从后端提取数据的情况下重置 largeData 数组,而在前端生成模拟数据的情况下却不需要?在这两种情况下,largeData 数组开始为空,然后一次填充一条记录。图表不应该关心数据的来源。
    • 我不得不猜测,但您可能已经在 onInit 钩子中拥有该起始代码。基本上发生的事情是在您的组件准备好将剑道图部署到屏幕(HTML 明智)之前创建了模拟数据,因此它已经存在。- 至于后端,数据对于组件初始化来说是迟到的,并且必须重新-渲染。结帐lifecycle hooks 以获取更多说明。
    • 是的,这听起来像是正在发生的事情。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多