2013-12-16 2 views
1

У меня есть несколько сетей (узлы + ссылки), которые хранятся в отдельных файлах JSON. Я загружаю их в макет Force в D3.js, и в отдельности они загружаются и компоноваются отлично. Тем не менее, я хочу добавить возможность загружать любые файлы на одной странице (по одному за раз) и запускать макет Силы всякий раз, когда новая сеть загружается из файла JSON.D3.js: Загрузка нескольких сетей из файлов JSON w/Force Layout

Как перезапустить компоновку Силы, когда новая сеть загружается из файла JSON? Ближайший я нашел http://bl.ocks.org/mbostock/1093130, но это работает только с одним файлом.

Странная связанная ошибка?

Я также заметил что-то особенное в плане силы. Если я быстро меняю файлы JSON каждые 1 секунду, Force Layout сохраняет их правильно. Если я подожду больше, чем за пару секунд до перехода, тогда силовая компоновка, по-видимому, будет установлена ​​на окончательной компоновке второй сетью, а затем перестанет выделять остальные сети.

Более подробно о выше: я понял, что я получаю неожиданное сообщение об ошибке, когда Layout Force не удается:

Uncaught TypeError: Cannot call method 'call' of undefined 

появляется ошибка внутренним для D3.js, в следующих строках:

d3_selectionPrototype.each = function(callback) { 
    return d3_selection_each(this, function(node, i, j) { 
     callback.call(node, node.__data__, i, j); 
    }); 
}; 

ответ

1

См https://github.com/mbostock/d3/wiki/Force-Layout#wiki-start

# force.start()

Starts the simulation; this method must be called when the layout is first created, after assigning the nodes and links. In addition, it should be called again whenever the nodes or links change. [...]

+0

исполняю 'force.nodes (graph.nodes) .links (graph.links) .start(); '(где' graph' - это сетевые данные) каждый раз после загрузки данных из файла JSON. По-прежнему кажется, что что-то заперто. –

+0

О, хорошо. Правильно ли это, если вы инициализируете новый 'd3.layout.force()' каждый раз, когда вы загружаете новые данные? – dechov

+0

Никаких кубиков нет. Хотя я только что понял, что он бросает ошибку каждый раз, когда маска силовой команды терпит неудачу: 'Uncaught TypeError: не может вызвать метод 'call' undefined'. Я расскажу подробности в оригинальном посте. –