2016-04-07 14 views
2

Bir svg kapsayıcısında d3 tarafından oluşturulan tüm şekillerin sırasını değiştirmem gerekiyor. Ama bunu yapamam. Yerel olarak yürütüldüğünde, aşağıdaki betik JSFiddle, "a ve b tanımlı değil" verir. Nasıl düzeltilmelidir?d3'te bir şekil seçimi nasıl sıralanır

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

Veri kümesini sıralamaya çalışın ve öğeleri yeniden sıralamak için selection.sort() öğesini çağırın. –

+0

ne demek istiyorsun? – tic

+2

'a' ve' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''] seçimleri için bir başvuru değil (ve bu nedenle .attr() 'yöntemine sahip değillerdir), bu seçimlere/öğelere bağlı olan verilere başvururlar. Durumunuzda, 'a' ve 'b', null'dır, çünkü veriye bağlanmadınız. Verilere bağlanma, d3'ün 'data()' yöntemini çağırmayı ve 'enter '()' i (append()' ile çalmayı içerir. Tüm bunları söyleyerek, sıralama sadece DOM'daki sırasını değiştirir, ekranda değil (x ve y için olanlar). Bu senin niyetin mi? – meetamit

cevap

2

Böyle sıralamak gerekiyor: Böyle yapmak tür uyarınca

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

dikdörtgen değiştirmek için:

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. 

yerine böyle yapmanın

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

çalışma kodu here

NOT: Yalnızca sağladığınız bilgiler uyarınca bunu yanıtlıyorum ancak doğru yaklaşım, yorumda @meetamit tarafından önerilen veri yöntemini yapmak olacaktır.

+0

Örneğim bir oyuncak örneğiydi. Amacım şekil öğelerinin arka-ön (z-sırası) önceliğini değiştirmek ve bunu yapmanın en basit yolunun şekil seçimini sıralamak olduğunu düşünüyorum. Hedefime ulaşmak için kodunuzu tamamladım. Sanırım yapılması gereken doğru şey. İlk sipariş mavi-kırmızı-sarıdır; sonuncusu sarı-kırmızı-mavi: https://jsfiddle.net/b09zbcu8/1/ – tic

+0

Sadece bir soru: [0] d3.selectAll ("rect") [0] 'da ne anlama geliyor? – tic

+0

' d3.selectAll ("rect") 'bir dizi dizi öğesi seçimleri verir. Böylece seçimdeki tüm unsurları elde etmek için d3.selectAll ("rect") [0] 'dır. Burada 0 ilk elementtir. – Cyril