У меня есть некоторые данные (Node
s), которые мне нужно нарисовать.Эти узлы могут перекрываться, и поэтому важен порядок , в котором они нарисованы (те, которые должны отображаться сверху, должны быть нарисованы в последнюю очередь).
Позиция и, следовательно, z-ось этих узлов может быть изменена, поэтому я попытался смоделировать это поведение с помощью ключа , который включает текущий индекс списка, в котором хранятся узлы.
case class Node(id: Int)
def addNodesToSVG = {
val sortedData: List[Node] = ???
val nodesSelection = d3.select("#nodes").selectAll(".node")
.data(sortedData.toJSArray, (n: Node) => {
n.id.toString +
// the position of those nodes may change over time
// that's why we need to include the position in the identifier
sortedData.indexOf(n)
}
nodesSelection.enter().append("g").attr("class", "node") // ...
nodesSelection
.attr("transform", transform) // ...
nodesSelection.exit().remove()
}
К сожалению, это не работает должным образом.
Теоретически, именно так я и думал, что это будет работать, если у меня всего два узла (n1
и * 1016).*), которые сохраняются в List(n1, n2)
node key
----- ---
n1 10 // node 1 at position 0
n2 21 // node 2 at position 1
Теперь, если я изменю Список на List(n2, n1)
и снова вызову addNodesToSVG
, я думаю, это произойдет:
node key
----- ---
n2 20 // node 1 at position 0
n1 12 // node 2 at position 1
Так как они неизвестны, я думал, что это удалит (nodesSelection.exit().remove()
) старые узлы и нарисует «новые» в правильном порядке.Это - однако - не происходит.Почему?
Редактировать после дополнительной отладки я обнаружил, что мой exit
Выбор всегда имеет размер 0.