#javascript #chart.js
#javascript #chart.js
Вопрос:
У меня есть график ChartJS. То, что я пытаюсь сделать, — это увеличить раздел моего графика, когда выбран сегмент круговой диаграммы. Затем уменьшите его, когда будет выбран другой раздел. Я могу увеличить раздел следующим образом (это работает):
onClick: (evt, item) =gt; { item[0].element.outerRadius = 10; },
если вы представляете круговую диаграмму, я хочу выбрать сегмент и увеличить его, затем, когда я выбираю другой сегмент, я хочу, чтобы исходный сегмент уменьшился и увеличил размер вновь выбранного сегмента. Я пытаюсь использовать счетчик, который переключается между 1 и 0 и увеличивает / уменьшает размер сегмента в зависимости от значения счетчика: Таким образом, приведенный ниже код работает, но только если я дважды нажму на один и тот же раздел. при первом нажатии на сегмент он увеличится, а при втором нажатии на тот же сегмент он уменьшится в размере.
Проблема в том, что когда я выбираю один сегмент, он увеличивается, а затем, когда я нажимаю на другой сегмент, он уменьшает второй сегмент. Как я могу это исправить?
Var global_enlarging_toggle = 0; onClick: (evt, item) =gt; { if (global_enlarging_toggle == 0){ global_enlarging_toggle = 1; item[0].element.outerRadius = 10; } else { item[0].element.outerRadius -= 10; global_enlarging_toggle = 0; } console.log(global_enlarging_toggle) console.log(item[0].element.outerRadius); }
,
То, что я пытался:
Я пытался как-то использовать то, что было нажато первым, и то, что было нажато вторым, и если да, то проверить, совпадают ли они или нет. но я не могу этого понять. Я сделал это, установив 2 новые переменные:
var first_segment; var second_segment; onClick: (evt, item) =gt; { if (global_enlarging_toggle == 0){ global_enlarging_toggle = 1; item[0].element.outerRadius = 10; first_segment = chart.data.labels[activeEls[0].index]; } else if (first_segment != second_segment) { item[0].element.outerRadius -= 10; global_enlarging_toggle = 0; second_segment = first_segment; } console.log(global_enlarging_toggle) console.log(item[0].element.outerRadius); }
But it doesnt work
Ответ №1:
Это связано с тем, что у вас есть глобальный переключатель singel. Если вместо этого вы создадите объект, в котором вы отслеживаете каждый элемент, по которому они были нажаты, и, таким образом, расширены, у вас не будет такого поведения:
const enlarged = {}; const expandAmount = 10; const options = { type: 'pie', data: { labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], datasets: [{ label: '# of Votes', data: [12, 19, 3, 5, 2, 3], backgroundColor: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"] }] }, options: { onClick: (evt, activeEls, chart) =gt; { const key = `${activeEls[0].datasetIndex}${activeEls[0].index}`; if (enlarged[key] || enlarged[key] === undefined) { activeEls[0].element.outerRadius = expandAmount; enlarged[key] = false; } else { activeEls[0].element.outerRadius -= expandAmount; enlarged[key] = true; } } } } const ctx = document.getElementById('chartJSContainer').getContext('2d'); new Chart(ctx, options);
lt;bodygt; lt;canvas id="chartJSContainer" width="600" height="400"gt;lt;/canvasgt; lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.1/chart.js"gt;lt;/scriptgt; lt;/bodygt;
Редактировать:
Обновите с желаемым поведением, сохраните глобальную переменную, которая отслеживает текущий набор данных и индекс данных, если она установлена, сначала установите ее обратно, а затем увеличьте текущий срез, если ключ такой же, как у старого ключа, ничего не делайте
let enlarged = ''; const expandAmount = 10; const options = { type: 'pie', data: { labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], datasets: [{ label: '# of Votes', data: [12, 19, 3, 5, 2, 3], backgroundColor: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"] }] }, options: { onClick: (evt, activeEls, chart) =gt; { const key = `${activeEls[0].datasetIndex}-${activeEls[0].index}`; const keys = enlarged.split('-'); if (keys.length == 2) { chart.getDatasetMeta(keys[0]).data[keys[1]].outerRadius -= expandAmount } if (key !== enlarged) { activeEls[0].element.outerRadius = expandAmount; enlarged = key; } else { enlarged = '' } } } } const ctx = document.getElementById('chartJSContainer').getContext('2d'); new Chart(ctx, options);
lt;bodygt; lt;canvas id="chartJSContainer" width="600" height="400"gt;lt;/canvasgt; lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.1/chart.js"gt;lt;/scriptgt; lt;/bodygt;
Комментарии:
1. Это не касается запрошенного поведения операции. Щелчок по одному разделу должен сбросить
outerRadius
значение всех остальных разделов и увеличить значение выбранного раздела (если он находится в базе) или сбросить его до базового (если он уже увеличен).2. @LeeLenalee спасибо за попытку, я ценю это, но приведенный выше комментарий верен, ваше решение выше только на полпути, цель состоит в том, чтобы попытаться уменьшить размер исходного сегмента при выборе другого сегмента, а также увеличить второй сегмент.
3. Спасибо, обновленный ответ
4. @LeeLenalee потрясающе, спасибо, это сработало. очень гладко, хорошо сделано. Спасибо.