Ответ 1
Есть несколько точек, которые вам нужны. Что я получаю от ваших вопросов: "как использовать шаблон повторного использования"
Простым ответом на этот вопрос было бы рассказать вам прочитать этот отличный учебник от Майка Бостока: для многократных диаграмм
Если вы хотите получить дополнительную информацию, этот выбор документов может быть интересным:
- документация по выбору
- как работают выборы
- Гистограмма, часть 2: Вероятно, самое интересное для понимания того, как работают обновления.
Теперь, вот проект реализаций, которые я сделал бы для вашей конкретной проблемы:
function ForceGraph(selector,data) {
// This is the class that will create a graph
var _data = data
// Local variable representing the forceGraph data
svg = d3.select(selector)
.append('svg')
// Create the initial svg element and the utilities you will need.
// These are the actions that won't be necessary on update.
// For example creating the axis objects, your variables, or the svg container
this.data = function(value) {
if(!arguments.length) {
// accessor
return _data;
}
_data = value;
return this;
// setter, returns the forceGraph object
}
this.draw = function() {
// draw the force graph using data
// the method here is to use selections in order to do:
// selection.enter().attr(...) // insert new data
// selection.exit().attr(...) // remove data that is not used anymore
// selection.attr(...) //
}
}
var selector = "#graphId";
var data = {nodes: [...],links: [...]};
myGraph = new ForceGraph(selector,data);
// Create the graph object
// Having myGraph in the global scope makes it easier to call it from a json function or anywhere in the code (even other js files).
myGraph.draw();
// Draw the graph for the first time
// wait for something or for x seconds
var newData = {nodes: [...],links: [...]};
// Get a new data object via json, user input or whatever
myGraph.data(newData);
// Set the graph data to be `newData`
myGraph.draw();
// redraw the graph with `newData`
Как вы, наверное, видите, цель состоит не в том, чтобы добавить функцию node. Цель состоит в том, чтобы перерисовать весь ориентированный на силу граф, только обновив или удалив существующие узлы и добавив новые узлы. Таким образом, код рисования записывается только один раз, затем изменяются только данные.
Для дальнейшего чтения этот вопрос был моим золотым призовым, когда я впервые занялся этой проблемой: Обновление ссылок на диаграмме, направленной на усиление, из динамических json-данных