Хммм, я не знаю аддона или 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
.