我正在尝试让一些飞镖代码与 D3 一起使用,但是当我调用 d3.layout.force().start() 时遇到了非常奇怪的问题。在下面的代码中,我已经注释掉了 force.size() 下面的所有内容。当我运行此代码并在浏览器中查看控制台输出时,我得到了单个 js.context.console.log() 的结果,它打印出我的对象,就像分配 word_map 时所写的一样。问题是,只要我取消注释 force.start() (顺便说一句),对象 word_map 就会开始更改,并且 console.log 会打印出 x 和 y 值为 NAN 的对象。
为什么 force.start() 将我的对象的 x 和 y 值更改为 NAN,当 console.log 在调用 force.start() 很久之前发生时,此更改如何显示在我的 console.log 语句中。就像 force.start() 首先被调用,而 console.log 被第二个调用。
import 'dart:html';
import 'package:js/js.dart' as js;
import 'dart:async';
import 'dart:js';
List<Map<String, String >> word_map;
void main() {
draw_visualization();
}
void draw_visualization(){
word_map =new List<Map<String,String>>();
word_map= [{'word':'hello','x':30.0,'y':20.0, 'fixed':false}];
JsObject word_list_js = new JsObject.jsify(word_map);
js.context.console.log(word_list_js);
print ("Made it here first");
var force = d3.layout.force()
.nodes(word_list_js)
.links(js.array([]))
.size([600,400]);
/* .start();
var chart = d3.select("body")
.append("svg")
.attr('width', 600)
.attr('height', 400);
var node = chart.selectAll('.node')
.data(word_list_js).enter().append('circle')
.attr('class','node')
.attr('r', 5)
.attr('cx', new js.FunctionProxy((d,i,e){return d.x;}))
.attr('cy',new js.FunctionProxy((d,i,e){return d.y;}))
.style('fill', 'blue')
force.on('tick', new js.FunctionProxy((e){
node.attr("cx", new js.FunctionProxy((d,i,e){
if (d.x > 0 && d.x<4000){print(d.x);}
return d.x;
}))
.attr("cy", new js.FunctionProxy((d,i,e){
return d.y;
})
);
}));
*/
}
我不得不承认,我对整个代理系统的工作方式有点困惑,Dart 的异步也给我带来了一些麻烦。我只是看不出 force.start 函数会如何影响前面的 console.log 语句。
总的来说,我只想让我的对象停止被强制布局弄得晕头转向。X 的 NAN 以及为什么要这样做,所以我的圈子不能正确绘制。
编辑:这似乎与重力有关。在 .start() 之前添加 .gravity(0) 后,它不会将 x 和 y 计算为 nan。我这样做是出于一种预感,即两种力量布局中的一种力量导致了这个问题。我仍然不明白为什么重力(0)解决了这个问题。