我在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轴上呈现正确的标签,如果我更改指标,则将使用相同的回调而不是另一个(在其他部分中)回调,并呈现相同的标签但具有更新的数据值。 有人可以帮忙吗?
答案 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
时我们总是返回一个新对象。