options.scales.yAxes [0] .ticks.callback无法在ember-cli-chart

时间:2019-05-21 06:11:16

标签: ember.js charts

我在ember-cli-chart文件中嵌入了hbs

<div class="chart">
    {{ember-chart type='line' data=data options=options}}
</div>

在我的组件文件中,我创建了一个 options 属性为

options: computed('metric', function() {
  let opts = defaultOptions;
  if (this.metric === 'height') {
     opts.scales.yAxes = [{
         ticks: {
             callback: function(value, index, values) {
              // code to return labels
             }
        }
     }]
  } else {
     opts.scales.yAxes = [{
         ticks: {
             callback: function(item, index, items) {
                 // code to return labels
             }
        }
     }]
  }

  return opts;
});

我想基于当前选择的指标显示Y轴标签。 第一次加载时间图表时,它将在y轴上呈现正确的标签,如果我更改指标,则将使用相同的回调而不是另一个(在其他部分中)回调,并呈现相同的标签但具有更新的数据值。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

嗯,我不知道插件或chart.js,但是在查看ember-chart组件的源代码时,我看到了

didUpdateAttrs() {
    this._super(...arguments);
    this.updateChart();
},

updateChart() {
    let chart   = this.get('chart');
    let data    = this.get('data');
    let options = this.get('options');
    let animate = this.get('animate');

    if (chart) {
        chart.config.data = data;
        chart.config.options = options;
        if (animate) {
            chart.update();
        } else {
            chart.update(0);
        }
    }
}

因此,为了更新chart.js,您需要启动didUpdateAttrs,这意味着在您的情况下,options本身需要更改。我不知道您如何创建defaultOptions,但是假设此引用永不更改,由于您没有更改对didUpdateAttrs的引用,因此没有理由options将触发只是在计算中更改defaultOptions的子道具)。我想:

import { assign } from '@ember/polyfills';
...
options: computed('metric', function() {
  let opts = assign({}, defaultOptions);
  if (this.metric === 'height') {
     opts.scales.yAxes = [{
         ticks: {
             callback: function(value, index, values) {
              // code to return labels
             }
        }
     }]
  } else {
     opts.scales.yAxes = [{
         ticks: {
             callback: function(item, index, items) {
                 // code to return labels
             }
        }
     }]
  }

  return opts;
})

足以触发您想要的行为,因为在重新计算options时我们总是返回一个新对象。