Angular Highcharts - 如何启用 noData 选项并动态更新它

Angular Highcharts - How to enable noData options and update it dynamically

我在本地使用以下 highcharts 依赖项:

这是我的源代码的实时 demo

首先我想指出的是,highCharts 的 noData 功能的使用和启用是相当可疑的。在任何地方都没有关于如何正确使用它的适当指南。

现在开始讨论这个问题,几天前我意识到需要显示正确的 "no data available" 消息而不是显示空图表。我做了一些研究,发现它可以在 highcharts 中启用,并在 JavaScript 中找到了它的工作演示。那么现在我们如何将它与 Angular 5 一起使用呢?这需要更多的研发,最后我弄明白了,

import * as noDataToDisplay from 'highcharts/modules/no-data-to-display.src';
...    
@NgModule({
  ...
  providers: [
  { provide: HIGHCHARTS_MODULES, useFactory: () => [noDataToDisplay] }
]

(注意:^^ 这种方法不适用于链接的 stackBlits 演示,不知道为什么!)

我确实成功地使用上述方法在我的 repo 中本地启用了它,但它并不健壮,即它没有始终如一地出现。

接下来我想动态切换 noData 消息,即以编程方式更新它,所以我尝试了以下方法:

const options = this.chartConfig.ref.options;
  options.lang.noData = `no data from: ${chartData.customMsgFromDate} to ${chartData.customMsgEndDate}.`;
this.chartConfig.ref.update(options, true);

当您从图例框中切换系列的可见性时,这确实起作用了一次,但现在这似乎也不起作用了。我有以下问题,

  1. 在 angular 5
  2. 中使用 noData 选项的正确方法是什么
  3. 如何确保它始终显示? setData([]) 或 setData(null) 等不同的配置可能使它始终显示,但我无法找到找出其不一致背后的根本原因。
  4. 如何动态切换 noData 消息。

此外,如果有任何我可以改进的地方,请告诉我,在此先感谢。

P.S 我确实找到了这个 fiddle 关于使用普通 JavaScript 实现的东西,但还没有实现任何东西使用 angular 图表。这是附加的代码 fiddle 似乎正在使用。

if (!chart.hasData()) {
    chart.hideNoData();
    chart.showNoData("Your custom error message");
}

可能这些方法不适用于我正在使用的 highcharts 版本。

感谢@Pandiyan 解决了 stackBlitz 导入的问题。

更新: 在本地我尝试更改 NoDataToDisplay 导入,

import * as noDataToDisplay from 'highcharts/modules/no-data-to-display.src';

到,

import NoDataToDisplay from 'highcharts/modules/no-data-to-display';

我收到以下导入错误。

因此,当我尝试遵循@daniel_s 的回答时出现以下错误。

我的所有依赖项都与提供的 stackBlitz 同步。我也

试试这个

import NoDataToDisplay from 'highcharts/modules/no-data-to-display';

...

{ provide: HIGHCHARTS_MODULES, useFactory: () => [NoDataToDisplay] }  

Slackblitz

  1. What is the proper way of using noData option with angular 5
  2. How to make sure it appears consistently? probably different configuration like setData([]) or setData(null) makes it appears in consistently, but I am not able to find out one root cause behind its inconsistency.
  3. How can I toggle noData message dynamically.

回复 1. noData 模块应该自动工作,因此如果您要向当前可见的系列之一添加一些点,则 "no-data" 消息会消失。同样,当您 remove() 系列点时,系列将是空的,然后 "no-message" 信息将在图表上可见。如果手动使用它,当然你可以像上面提到的那样做。这是一个简单的使用示例(包括按钮):https://stackblitz.com/edit/highcharts-toggling-nodata-w5fwkf

Re 2. 如果使用 setData([])setData(null) 看起来不错。这是示例: https://stackblitz.com/edit/highcharts-toggling-nodata-54xrqh 。如果您的意思不同,能否更准确地描述您的问题?

关于 3。如果你的意思是动态改变 noData 消息,你应该设置 chart.options.lang.noData 属性 等于一些新的字符串,然后调用 chart.hideNoData()chart.showNoData刷新元素值。这是应用于 ng 的示例:https://stackblitz.com/edit/highcharts-toggling-nodata-hwnzcl

[编辑]

参考您的问题更新,为了直接在组件中使用特定模块而不是通过在提供程序中设置它,只需从 app.module.ts 文件中删除 { provide: HIGHCHARTS_MODULES, useFactory: () => [NoDataToDisplay] },然后加载适当的模块app.component.ts 使用 require() 语法,如下所示:

import Highcharts from 'highcharts';

const noData = require('highcharts/modules/no-data-to-display')
noData(Highcharts)

实例: https://stackblitz.com/edit/highcharts-toggling-nodata-muxx9s

亲切的问候!

**