Я хочу, чтобы пользователи могли просматривать свою сеть, используя d3 forceSimulation или CoLa layout , что означает, что когда пользователь запускает событие, мне нужно изменить, какой изэти алгоритмы компоновки обновляют атрибуты x
и y
моих узлов и ребер.
В частности, для этого необходимо, чтобы я мог остановить моделирование и запретить им обновлять эти атрибуты в данных, которые ядать им, пока другой «активен», а также удалить связанные с ними обработчики перетаскивания.
Моя функция рендеринга в настоящее время имеет:
if (use_cola) {
// MUST TURN OFF D3 AND ITS DRAG HANDLERS!
force = cola_force.nodes(graph.nodes)
.links(links)
.groups(groups[group_nodes_by])
.jaccardLinkLengths(repulsion_strength, 0.7)
.avoidOverlaps(true)
.start(50, 0, 50);
node.call(cola_force.drag);
group.call(cola_force.drag);
cola_force.on('tick', ticked);
} else { // d3
// MUST TURN OFF COLA AND ITS DRAG HANDLERS!
force = d3_force.nodes(graph.nodes)
.force("link", d3.forceLink(links))
.force("charge", d3.forceManyBody().strength(-repulsion_strength))
.force("center", d3.forceCenter(w/2,h/2));
node.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended)); // where those are the conventional functions
d3_force.on('tick', ticked);
}
Одним из решений может быть манипулирование этими объектами, например, delete d3_force['something_important']
Может работать что-то более простое, например d3_force.nodes([])
илисконвертировано.
Я не уверен, как бы я делал что-то похожее на обработчики перетаскивания, потому что я менее знаком с тем, как они работают.
Обновление 1:
Частичное решение, предложенное для обработчика перетаскивания d3 (в d3v3) здесь :
var dragCallback = d3.select('rect#no-drag').property('__onmousedown.drag')['_'];
d3.select('rect#no-drag').on('mousedown.drag', null);
и последующее восстановление его позже:
d3.selectAll('rect#no-drag').on('mousedown.drag', dragCallback);