метод диаграммы setSelection
не работает должным образом на календарной диаграмме, см. Выпуск №: 2614
, если вы используете setSelection
, он будет принимать только индекс строки.
[{"row":0,"column":null}]
не является ссылкой на дату, как видно, когда пользователь выбирает дату.
[{"date":1530748800000}]
проблема здесь, она застревает, и нет никакого способа удалить начальный выбор.
когда пользователь фактически выберет дату, getSelection
вернет два выбора,
начальное значение, установленное с помощью setSelection
и значение, выбранное пользователем.
[{"row":0,"column":null},{"date":1543536000000,"row":3}]
индекс строки включается в выборку, если дата присутствует в таблице данных.
см. Следующий рабочий фрагмент,
для события 'ready'
на графике установлен начальный выбор.
выберите дату вручную, чтобы увидеть выбор и «застрявшее» значение.
примечание: при задании начального значения событие 'select'
сработает в первом 'mouseover'
.
google.charts.load('current', {
packages:['calendar']
}).then(function () {
var response = {d: {Rows: [
['11/27/2018', 5],
['11/28/2018', 10],
['11/29/2018', 15],
['11/30/2018', 20]
]}};
var dataTable = new google.visualization.DataTable();
dataTable.addColumn({type: 'date', id: 'Date'});
dataTable.addColumn({type: 'number', id: 'Changes'});
for (var i = 0; i < response.d.Rows.length; i++){
var row = [new Date(response.d.Rows[i][0]), response.d.Rows[i][1]];
dataTable.addRow(row);
}
var chart = new google.visualization.Calendar(document.getElementById('calendar_basic'));
var options = {
title: 'Total Alerts Triggered By Day',
//calendar: {cellSize: 25},
colorAxis: {colors: ['#86ce76', '#d61007']},
};
function selectHandler() {
var selection = chart.getSelection();
console.log('length', selection.length);
if (selection.length > 0) {
console.log(JSON.stringify(selection));
}
}
google.visualization.events.addListener(chart, 'select', selectHandler);
google.visualization.events.addOneTimeListener(chart, 'ready', function () {
chart.setSelection([{row: 0}]);
});
chart.draw(dataTable, options);
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="calendar_basic"></div>
вместо использования setSelection
для установки начального значения,
добавление аргумента в обработчик выбора, который принимается при вызове вручную,
не будет присутствовать, когда пользователь выбирает дату.
function selectHandler(initialDate) {
var selection = initialDate || chart.getSelection();
if (selection.length > 0) {
console.log(new Date(selection[0].date));
}
}
затем вы можете вызвать обработчик выбора для события готовности.
см. Следующий рабочий фрагмент ...
google.charts.load('current', {
packages:['calendar']
}).then(function () {
var response = {d: {Rows: [
['11/27/2018', 5],
['11/28/2018', 10],
['11/29/2018', 15],
['11/30/2018', 20]
]}};
var dataTable = new google.visualization.DataTable();
dataTable.addColumn({type: 'date', id: 'Date'});
dataTable.addColumn({type: 'number', id: 'Changes'});
for (var i = 0; i < response.d.Rows.length; i++){
var row = [new Date(response.d.Rows[i][0]), response.d.Rows[i][1]];
dataTable.addRow(row);
}
var chart = new google.visualization.Calendar(document.getElementById('calendar_basic'));
var options = {
title: 'Total Alerts Triggered By Day',
//calendar: {cellSize: 25},
colorAxis: {colors: ['#86ce76', '#d61007']},
};
function selectHandler(initialDate) {
var selection = initialDate || chart.getSelection();
if (selection.length > 0) {
console.log(new Date(selection[0].date));
}
}
google.visualization.events.addListener(chart, 'select', selectHandler);
google.visualization.events.addOneTimeListener(chart, 'ready', function () {
selectHandler([{date: (new Date).getTime()}]);
});
chart.draw(dataTable, options);
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="calendar_basic"></div>
ОБНОВЛЕНИЕ
из github, попробуйте заменить ...
var selectedItem = initialDate || chart.getSelection()[0];
if (selectedItem.length > 0) {
console.log(new Date(selectedItem[0].date));
}
с ...
var selectedItem;
var selection = initialDate || chart.getSelection();
if (selection.length > 0) {
console.log(new Date(selection[0].date));
selectedItem = selection[0];
}
вы не должны использовать -> chart.getSelection()[0]
, потому что обработчик выбора будет запускаться как при выборе чего-то , так и невыбранном.
если не выбран, chart.getSelection()[0]
выдаст ошибку, потому что выбор будет пустым.