Да, вы правы, это вопросы программирования и JavaScript, на самом деле не так много общего с dc.js или d3.js.
обратные вызовы, которые зависят от обратных вызовов
Сначала мы посмотрелигде помещать обратные вызовы, такие как обработчики щелчков, которые управляют визуализацией и / или данными, которые устанавливаются другим обратным вызовом, таким как обработчик полученных данных.
Проблема в том, что данные и диаграмма могут быть недоступны в области верхнего уровня.
Самое простое решение - поместить обработчик щелчков внутри обработчика данных, чтобы он имел доступк диаграмме и данным.
повторное использование преобразований данных
Следующая проблема, с которой вы сталкиваетесь, - где поместить преобразование данных, чтобы оно вызывалось как до рисования диаграммы, так и послеa click.
В настоящее время ваш обработчик кликов ничего не делает, потому что он заменяет данные ... теми же данными. (грустный тромбонный звук)
Существует множество способов решить эту проблему, но самый простой способ изменить текущий код - перевести преобразования данных в повторно используемую функцию :
function transform_data(data, varMetric) {
data.forEach(function(d) {
d.date = parseDate(d.date);
d.dateString = formatDateYYYYMMDD(d.date);
if (varMetric == 'sessions') {
d.metric = +d.sessions;
} else if (varMetric == 'users') {
d.metric = +d.users;
} else if (varMetric == 'bounceRate') {
d.metric = +d.bounceRate;
} else if (varMetric == 'newUsers') {
d.metric = +d.newUsers;
} else if (varMetric == 'sessionDuration') {
d.metric = +d.sessionDuration;
} else if (varMetric == 'sessionsPerUser') {
d.metric = +d.sessionsPerUser;
} else if (varMetric == 'twitterSessions') {
d.metric = +d.twitterSessions;
}
countLoop = counter++;
});
}
Теперь это может произойти до того, как будет нарисован график:
function awsDataFile(error, data) {
if (error) {
return console.log(error);
}
mergedcsv = d3.csv.parse(data.Body.toString());
var parseDate = d3.time.format("%Y%m%d").parse;
var counter = 0;
var varMetric = 'sessions';
transform_data(mergedcsv, varMetric);
var ndx = crossfilter(mergedcsv);
// ...
И мы можем повторить преобразование данных одним щелчком мыши:
$('#metric a').click(function(e) {
var varMetric = $(e.target).text();
console.log('onclick ' + varMetric);
transform_data(mergedcsv, varMetric);
ndx.remove();
ndx.add(mergedcsv);
dc.redrawAll();
});
Примечание: с помощью постоянного тока. js вы определенно хотите визуализировать только в первый раз, а затем перерисовывать при изменении данных. Рендеринг начинается с нуля, в то время как перерисовка будет выполнять (обычно) приятные анимированные переходы.