2016-04-07 3 views
2

Мне нужно изменить порядок всех форм, созданных d3 в контейнере svg. Но я не могу этого сделать. Следующий сценарий в JSFiddle, когда выполняется локально, дает «a и b не определен». Как его исправить?как отсортировать выбор формы в d3

var svg = d3.select("body") 
.append("svg") 
.attr("width", 100) 
.attr("height", 100); 

svg.append("rect") 
.attr({x:0,y:0,height:10,width:10,fill:'yellow'}) 
.attr("sort",3); 
svg.append("rect") 
.attr({x:0,y:20,height:10,width:10,fill:'red'}) 
.attr("sort",2); 
svg.append("rect") 
.attr({x:0,y:40,height:10,width:10,fill:'blue'}) 
.attr("sort",1); 

d3.selectAll("rect").sort(function(a,b){return a.attr("sort")-b.attr("sort")}); 

d3.selectAll("rect") 
.each(function(d,i){alert(d3.select(this).attr("sort"))}); 
+0

Лучше попытаться отсортировать набор данных, а затем вызвать selection.sort(), чтобы изменить порядок элементов. –

+0

Что вы имеете в виду? – tic

+2

'a' и' b' внутри 'sort' не являются ссылками на выбор (и, следовательно, они не имеют метода' .attr() '), это ссылки на данные, привязанные к этим выборам/элементам. В вашем случае оба 'a' и' b' являются 'null', потому что вы не привязывались к данным. Привязка к данным включает вызов метода 'data()' d3 и работу с 'enter()' to 'append()' them. Сказав все это, сортировка только изменяет их порядок в DOM, а не на экране (для этого нужны x и y). Это ваше намерение? – meetamit

ответ

2

Вам нужно сортировать так:

var rects = d3.selectAll("rect")[0].sort(function(a, b) { 
    return d3.select(a).attr("sort") - d3.select(b).attr("sort") 
}); //here rects will store the correct sorted order rectangle DOMs. 

а не делать так:

d3.selectAll("rect").sort(function(a,b){return a.attr("sort")-b.attr("sort")}); 

Теперь, чтобы изменить прямоугольник как на подобное сделать так:

rects.forEach(function(rect, i){ 
    d3.select(rect).attr("y", (i*20));//change the attribute of y 
}) 

рабочий код here

ПРИМЕЧАНИЕ: Я просто отвечаю на это в соответствии с информацией, которую вы предоставили, но правильный подход - сделать это способом данных, предложенным @meetamit в комментарии.

+0

Мой пример был примером для игрушек. Моя цель - изменить приоритет передней части (z-порядок) элементов формы, и я полагаю, что самый простой способ сделать это - это сортировка формы. Я выполнил свой код, чтобы достичь своей цели. Полагаю, это правильно. Начальный порядок - сине-красный-желтый; последний - желтый-красный-синий: https://jsfiddle.net/b09zbcu8/1/ – tic

+0

Еще один вопрос: что означает [0] в d3.selectAll («rect») [0]? – tic

+0

'd3.selectAll (" rect ")' дает массив элементов массива. поэтому, чтобы получить все элементы в выборе, мы делаем 'd3.selectAll (" rect ") [0]' здесь 0 является первым элементом. – Cyril

Смежные вопросы