Как я могу захватить данные DataTable Google Visualization после загрузки диаграммы?
Я хочу захватить данные Google Chart со страницы, преобразовать ее в CSV, а затем передать ее загрузчику.
В chartpage.js
function downloadCSV(args) {
var csvData, filename, link;
var action = args.action_name;
var csv = convertArrayOfObjectsToCSV({
action_name: action
});
filename = args.filename || 'export.csv';
csvData = encodeURI(csv);
link = document.createElement('a');
link.setAttribute('href', 'data:text/csv;charset=utf-8,' + csvData);
link.setAttribute('type', 'data:text/csv;charset=utf-8');
link.setAttribute('download', filename);
link.click();
}
Затем в chart.coffee:
init_chart = ->
chart = new google.visualization.BarChart(document.getElementById('chart_div')); //#chart_div in chart.html.haml
render_chart = (items, year)->
@data = new google.visualization.DataTable()
data.addColumn 'string', I18n.t('charts.name')
// Other logic for building chart from Rails DB Data
for key_item in items
label = []
[key, item] = key_item.split(':')
if key == 'competitor_meded_involvement'
label.push I18n.t('charts.competitor')
label.push I18n.t("kol_items.#{item}")
data.addColumn 'number', label.join(' - ')
// and so on.
google.charts.load 'current', 'packages': ['corechart']
google.visualization.events.addListener(@data, 'ready', setData) // I read this was a solution but it doesn't seem to help
google.charts.setOnLoadCallback ->
init_chart()
render_chart()
$(setData(@data)) //I tried passing this to a setter method over in chartpage.js which takes @data and tries to set it globally but that makes no difference at page load time.
В chart.html.haml:
%h5{id: "downloadCSV"}= link_to '<i class="fa fa-file-excel-o"></i> Download CSV'.html_safe, "#"
#chart_div
Поэтому я стараюсь, как выше, так и в основном JS:
case 'chart_kol_comparison':
google.setOnLoadCallback(function() {
str = google.visualization.dataTableToCsv(window.data); //This builds the CSV string and returns it to the download JS for output
});
Но переменная данных со страницы JS (HAML):
@data = new google.visualization.DataTable()
Кажется, что он доступен только после загрузки страницы, а не при загрузке JS и пытается захватить данные.
Он работает, когда я запускаю следующее в консоли, но не при загрузке страницы. Это приложение Rails.
str = google.visualization.dataTableToCsv(data); //var data is populated after page loads (available from console) but not from the JS at page load time.
Как я могу это сделать?
Ответы
Ответ 1
Для меня привязка к событию никогда не срабатывала. Так что я должен был сделать, в chart page.js:
function setData(data) {
after_data = data;
}
google.visualization.dataTableToCsv(window.after_data);
И в chart.coffee:
setData(data)
Где данные - объект данных GoogleTable.
Поэтому в основном мне приходилось создавать сеттер за пределами файла google js.
Ответ 2
То, что, кажется, происходит здесь, состоит в том, что вы не дожидаетесь, когда диаграмма /datatable будет полностью отображена после вызова draw. Таким образом, лучший способ достичь этого - создать обработчик событий, ожидающий готового события диаграммы /datatable.
google.visualization.events.addListener(tableChart, 'ready', myReadyHandler);
и вы добавляете функцию, которая заполняет вашу переменную, но после того, как график /datatable будет готов.
function myReadyHandler(){
// fill variables here or call directly your other methods,
// this will ensure, you can grab data from the chart/datatable
// because is completely rendered and you can play with that
}