注释不显示在 vue-chartjs 中

Emi*_*tew 0 javascript chart.js vue-chartjs

我正在使用vue-chartjs. 我需要在图表中添加注释。我导入了一个注释插件

import chartjsPluginAnnotation from "chartjs-plugin-annotation"
Run Code Online (Sandbox Code Playgroud)

然后在mounted上添加一个插件

this.addPlugin(chartjsPluginAnnotation)
Run Code Online (Sandbox Code Playgroud)

另外,我在选项中添加了一个注释对象

plugins: {
  annotation: {
          drawTime: 'afterDraw',
            annotations: [
              {
                type: "line",
                id: 'BTV',
                mode: "horizontal",
                display: true,
                scaleID: "y-axis-0",
                borderColor: "red",
                value: 17000,
                borderDash: 4,
                label: {
                  content: 'aa',
                  enabled: true,
                  position: "top",
                  xAdjust: 15,
                  backgroundColor: '#4ecca3',
                  fontSize: 10,
                }
              }
          ]
  },
}
Run Code Online (Sandbox Code Playgroud)

它适用于我找到的所有手册,但不适用于我的项目

小智 6

如果您使用的是“chart.js” v2.9.4(最新),只需将其降级到 v2.9.3 。也许他们在那个版本上有一些问题。

请在下面检查我的“package.json”。

"dependencies": {
  "chart.js": "^2.9.3",
  "chartjs-plugin-annotation": "^0.5.7",
  "vue": "^2.6.11",
  "vue-chartjs": "^3.5.1" 
}
Run Code Online (Sandbox Code Playgroud)

它适合我。


nb1*_*987 6

我看到的一个问题是您已经annotation在下定义,plugins而它应该直接options. (我知道这很令人困惑,因为一些 chartjs-annotation-plugin 文档仍然显示了一个示例,annotation其属性为 ofplugins而不是options。)

然而,还有另一个问题似乎源于 Chart.js 2.9.4 中所做的更改。克隆对象的方法已修改,现在可以使用Object.create(),将源对象的属性复制到目标对象的原型中。问题是,在 Vue 应用程序的上下文中options,您传递给renderChart()方法的 很可能是 Vue 观察者(例如,prop 或 的成员data),这意味着它的属性都已设置(由 Vue,在引擎盖)使用Object.defineProperty()。这就是为什么这很重要:

为对象设置属性会创建自己的属性。获取和设置行为规则的唯一例外是当存在带有 getter 或 setter 的继承属性时。

(来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

这是一个问题的原因是,当 Chart.js 初始化图表时,它通过递归地将配置选项与一堆全局默认值合并来创建选项;如果属性是非标准选项,则此合并行为的一部分涉及上述克隆,这将使您的annotation对象的属性复制到其原型,但没有自己的属性。因此,当注解插件初始化时,它会找到一个注解对象,但它没有自己的任何属性,并且当注解插件初始化配置时,它将您的annotation对象与其默认值合并- 其中包括一个空annotations数组。

在我看来,那降级chart.js之于2.9.3应为你工作,只要你同时将你annotation从财产plugins直接下options。另一种选择——如果你想继续使用最新版本的 Chart.js——是确保你传递给renderChart()方法的选项是非反应性的(即,不是 Vue 观察者)。实现这一点的一种方法是将反应annotation对象的属性复制到 POJO(Plain Old Javascript Object)中,例如,通过使用Object.assign()

this.renderChart(this.chartData, { 
  ...this.options, 
  annotation: Object.assign({}, this.options.annotation) 
})
Run Code Online (Sandbox Code Playgroud)

我在 Chart.js GitHub 上提交了一个问题:https : //github.com/chartjs/Chart.js/issues/8382