A seleção de arco/elemento
-
12-12-2019 - |
Pergunta
No sunburst, como eu posso tornar o código seleccione uma raiz de arco, apenas depois de todos os arcos foi gerado?
Por exemplo, no código a seguir:
var first_arc = ""
.json("../data/flare.json", function(json) {
var path = vis.data([json]).selectAll("path")
.data(partition.nodes)
.enter().append("path")
.attr("display", function(d) { return d.depth ? null : "none"; })
.attr("d", arc)
.attr("t_name", function(d) {return d.name})
.style("fill-rule", "evenodd")
.on("click", function(d)...
seria passado como "d" para a "função" clique em no meio do arco.
(seus dados vai primeiro no arquivo json)
Atualização 1:Alterar o código assim...
.style("fill-rule", function(d) {
if (first_arc == "") first_arc = d; return "evenodd"})
...resolvido o problema, ele retorna object
:
name: "flare"
children: Array[10]
...
mas esta solução não está certo e não é geral.
Atualização 2:Eu tentei várias seleciona, por exemplo:
first_arc = d3.select("[name='flare']")
ele geralmente retorna array
:
0: null
length: 1
parentNode: HTMLHtmlElement
__proto__: Array[0]
ou "indefinido"
Atualização 3:
first_arc = d3.select("[t_name='flare']")
retorna array
de tamanho 1 com crianças:
0: SVGPathElement
__data__: Object
, onde __data__
é o objeto que eu estou procurando, mas eu não posso gerenciar para selecioná-lo.
Solução
O nó raiz é o único com uma "profundidade" atributo definido para 0.Portanto, você pode dizer:
d3.selectAll("path").filter(function(d) { return d.depth === 0; })
Suas tentativas acima não estavam funcionando porque D3 usa CSS3 para selecionar elementos.Portanto, você só pode usar d3.selecione e d3.selectAll com CSS3 seletores i.e.você não pode acessar os dados associados a cada elemento desta forma.O caminho para filtrar os dados acoplados é usar seleção.filtro.
D3 seleções são, literalmente, uma matriz de elementos, consulte a "Operacional nas Seleções" seção.
Por último, você pode obter o dependente __data__
propriedade de um elemento usando seleção.datum().