Я интегрируя NVD3 в приложение на основе Eclipse, SWT, и я хотел бы передать Javascript событие диаграммы вложению коды Java (publishEventJavaSide и logToJavaContainer является BrowserFunctions). Это отлично работает для перенаправления события elementClick
. Код для elementClick
выглядит примерно так:обработки JavaScript события диаграммы NVD3
nv.addGraph(function() {
try {
function generateChart() {
return nv.models.discreteBarChart()
.x(function (d) {
return d.name
})
.y(function (d) {
return d.value
})
.staggerLabels(false)
.tooltips(true)
.showValues(true);
}
var chart = generateChart();
chart.dispatch.on('elementClick', function (e) {
publishEventJavaSide('elementClick', JSON.stringify(e, jsonCensor));
});
logToJavaContainer('TRACE', 'The JSON Data to be displayed in the chart sent by the server is the following: \n' + JSON.stringify(JSON.parse(generateData()), null, 4));
d3.select('#chart svg').datum(JSON.parse(generateData())).transition().duration(500).call(chart);
nv.utils.windowResize(chart.update);
return chart;
} catch (e) {
logToJavaContainer('ERROR', 'Error while running chart creation function' + JSON.stringify(e, ["message", "arguments", "type", "name", "stack"]));
}
});
После просмотра источник DiscreteBarChart я предполагал, что любой из chartClick
, elementDblClick
, elementMouseover
, elementMouseout
должен работать как elementClick
работ. Но на самом деле ни один из них не работает. Если я пытаюсь следующий код для elementDblClick
(только название события изменяется):
nv.addGraph(function() {
try {
function generateChart() {
return nv.models.discreteBarChart()
.x(function (d) {
return d.name
})
.y(function (d) {
return d.value
})
.staggerLabels(false)
.tooltips(true)
.showValues(true);
}
var chart = generateChart();
chart.dispatch.on('elementDblClick', function (e) {
publishEventJavaSide('elementDblClick', JSON.stringify(e, jsonCensor));
});
logToJavaContainer('TRACE', 'The JSON Data to be displayed in the chart sent by the server is the following: \n' + JSON.stringify(JSON.parse(generateData()), null, 4));
d3.select('#chart svg').datum(JSON.parse(generateData())).transition().duration(500).call(chart);
nv.utils.windowResize(chart.update);
return chart;
} catch (e) {
logToJavaContainer('ERROR', 'Error while running chart creation function' + JSON.stringify(e, ["message", "arguments", "type", "name", "stack"]));
}
});
Это не работает. Обертывание улов ловит следующее сообщение об ошибке, поступающей из линии chart.dispatch.on('elementDblClick', function (e)
:
Error while running chart creation function{
"message":"Cannot call method 'on' of undefined",
"name":"TypeError",
"stack":
"TypeError: Cannot call method 'on' of undefined
at d3_dispatch.on (http://127.0.0.1:10080/chart:1132:78)
at Object.eval [as generate] (eval
at <anonymous> (eval
at <anonymous> (http://127.0.0.1:10080/rwt-resources/rap-client.js:54872:27)), <anonymous>:12:16)
at http://127.0.0.1:10080/chart:10440:21"
}
ссылка chart.dispatch
это, конечно, не неопределенная (я проверил с предупреждением, и это Object
), и дело происходит от кода d3 где-то. Я также уверен, что моя интеграция не имеет к этому никакого отношения. К сожалению, я мог найти только примеры с elementClick
.
Я не специалист по Javascript и D3 или NVD3, пожалуйста, будьте терпеливы со мной в объяснении.
отлично работает. Только chartClick не работает, но на самом деле это меня не слишком беспокоит. Откуда вы это узнали? Как это видно из исходного кода? –
Я вижу. "nv.models.discreteBar = function() {..." из исходного кода. ОК. –