2014-01-23 2 views
0

Я интегрируя 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, пожалуйста, будьте терпеливы со мной в объяснении.

ответ

1

Вы можете попробовать:

chart.discretebar.dispatch.on("elementClick", function(e) { 
    console.log('elementClick', e); 
}); 
+0

отлично работает. Только chartClick не работает, но на самом деле это меня не слишком беспокоит. Откуда вы это узнали? Как это видно из исходного кода? –

+0

Я вижу. "nv.models.discreteBar = function() {..." из исходного кода. ОК. –

Смежные вопросы