私は、フィルタ選択ボックスでデータを動的に再読み込みするChart.js 2.0棒グラフを提供するVue.js 2.0コンポーネントを持っています。Chart.jsのVue.jsコンポーネント - AJAXリロードの奇妙な問題
グラフのデータセットにクリックイベントを追加した後、フィルタでデータを再読み込みするときに問題が発生しました。ページが最初にロードされるとき、私は各データセットをクリックし、情報をコンソールに記録することができます。選択ボックスからフィルタを選択し、データセットをAJAX経由でリロードした後、データセットをクリックすると散発的な結果になります。再ロード後のほとんどの場合、私はUncaught TypeError: Cannot read property '_index' of undefined
を取得しますが、コンソールに記録された2〜4個のデータセットを取得することもありますが、現在のビューには存在しないものが1つあります。私のコンポーネントコードは以下の通りです。グラフデータを再読み込みした後にクリックイベントを修正するにはどうすればよいですか?どんな助けもありがとうございます。
import Chart from 'chart.js';
export default {
template: `
<div v-bind:class="[chartDivSize]">
<div class="card">
<div class="header">
<div class="row">
<div class="col-md-6">
<h4 class="title">
{{ title }}
</h4>
<p class="category">{{ category }}</p>
</div>
<div v-if="isManager" class="col-md-4 pull-right">
<h4 class="title pull-right">Filter by Team</h4>
<select v-model="selectedFilter" @change="reload" class="form-control selectpicker">
<option v-for="filter in filters">{{ filter }}</option>
</select>
</div>
</div>
</div>
<div class="content">
<canvas v-bind:id="chartId" style="height: 352px; width: 704px;" width="1408" height="704"></canvas>
</div>
<div class="footer">
<div class="legend">
</div>
<hr>
<div class="stats">
<i class="fa fa-clock-o"></i>{{ stats }}
</div>
</div>
</div>
</div>
</div>
`,
props: ['ctx', 'chart', 'url', 'chartId', 'chartDivSize', 'title', 'category', 'stats', 'filters', 'isManager', 'selectedFilter', 'activePoints'],
ready() {
this.load();
},
methods: {
load() {
this.fetchData().then(
response => this.render(response.data)
);
},
fetchData() {
if(this.selectedFilter) {
var resource = this.$resource(this.url);
return resource.get({ filter: this.selectedFilter });
} else {
return this.$http.get(this.url);
}
},
render(data) {
this.title = data.title;
this.category = data.category;
this.stats = data.stats;
this.filters = data.filters;
this.filters.unshift('All');
if(data.selectedFilter) {
this.selectedFilter = data.selectedFilter;
} else {
this.selectedFilter = 'All';
}
this.isManager = data.isManager;
this.ctx = $("#" + this.chartId);
var chartData = {
labels: data.labels,
datasets: [
{
label: data.metric,
data: data.data,
backgroundColor: data.background_colors,
hoverBackgroundColor: data.hover_colors
}]
};
this.chart = new Chart(this.ctx, {
type: "bar",
data: chartData,
options: {
scaleLabel: {
display: true
},
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
fontStyle: "bold"
}
}],
xAxes: [{
ticks: {
beginAtZero: true,
fontStyle: "bold"
}
}]
},
legend: {
display: false
}
}
});
this.$nextTick(() => {
this.setChartClickHandler(this.ctx, this.chart);
});
},
reload() {
this.chart.destroy();
this.load();
},
setChartClickHandler(ctx, chart) {
ctx.on('click', evt => {
var activePoints = chart.getElementsAtEvent(evt);
var label = chart.data.labels[activePoints[0]._index];
var value = chart.data.datasets[activePoints[0]._datasetIndex].data[activePoints[0]._index];
console.log(label,value);
});
},
},
}
マイ上記の答えのポイントはしかし、実際の問題は何か他のもののようです。私はここに別の答えを掲示して、それをチェックしてください。 – Mani