我正在使用Vaadin框架(https://vaadin.com/home)将d3.js集成到我的java代码(类似于http://www.rapidpm.org/2013/10/using-javascript-libraries-d3-in-vaadin.html)。基本上,这个Javascript代码绑定到一个Java类,并对所述Java类中的状态变化做出反应。从动态JSON更新d3图(onStateChange)
============================================== ====================================
所以,当java图表的状态 - 调用this.conStateChange方法:javascript从java类(var string = this.getState()。string;)中提取一个新的String,将其解析为JSON并呈现图形。
按钮单击将通过更改Java类(!)中的字符串触发状态更改,从而触发所描述的方法并从新的JSON解析的字符串中呈现新图形。
... THEORETICALLY ...但是,实际上,如果我在图表消失后单击该按钮。只有当我再次单击该按钮时,才会呈现新图形。
/*not so interesting code
var diagramElement = this.getElement();
var width = 960, height = 500;
var force = d3.layout.force().size([ width, height ])
.charge(-400)
.linkDistance(40)
.on("tick", tick);
var drag = force.drag()
.on("dragstart", dragstart);
var svg = d3.select(diagramElement)
.append("svg")
.attr("width", width)
.attr("height", height);
var link = svg.selectAll(".link"),
node = svg.selectAll(".node");*/
/*interesting code*/
this.onStateChange = function() {
link.remove(); //delete old graph
node.remove(); //delete old graph
var string = this.getState().string;
graph = JSON.parse(string);
force.nodes(graph.nodes).links(graph.links).start();
link = link.data(graph.links)
.enter().append("line")
.attr("class", "link");
node = node.data(graph.nodes)
.enter().append("circle")
.attr("class", "node")
.attr("r", 12)
.on("dblclick", dblclick)
.call(drag);
};
所以,什么是错与此(确实不是很优雅)的代码,我怎么能做到这一点,只需一次点击将[1]取下图形显示和[2]渲染新图?
在此先感谢...
浏览器控制台中的任何错误?你可以在你的JS代码中添加一些console.log行来查看数据是否一切正常?例如''的console.log(字符串); var graph = JSON.parse(string); console.log(graph);'' – cfrick
我已经在onStateChange函数中添加了您的控制台输出。它们的输出始终是相同的,当加载时,单击按钮一次或两次... console.log(string)==>“Object {nodes = [13],links = [18]}” – SuperUser01