2012-05-22 27 views
8

Verilere dayanarak içerik oluşturmak için d3.js kitaplığını kullanıyorum.D3.js'deki verileri yeniden oluşturmanın en iyi yolu

İşte basitleştirilmiş bir örnek. Örneğin, yeni verilerim [5,3] şeklindeyse, dizimi değiştirirsem [5,3]. Yeni html’i yeniden adlandırmanın ve göstermenin en iyi yolu nasıl? Aynı cümleyi tekrar aramak zorunda mıyım yoksa daha iyi bir yol mu? Daha karmaşık bir veri yapısının durumunu ele alın. yani

data_arr = [obj1, obj2, obj3, obj4]; 

ve

ben obj1.field = 'newValue' yapmak ne olur
element.innerHTML = '<div id="innerDiv">' + d.field + '</div>'; 

. İsyan nasıl yapılır?

Teşekkürler!

cevap

18

Bir işlev kullanın. Örneğin, aşağıda dizelerden oluşan bir diziden bir listeyi oluşturacak bir işlev var: Artık listenizi başlatmak istiyorsanız

function list(ul, data) { 
    var li = ul.selectAll("li").data(data); 
    li.exit().remove(); 
    li.enter().append("li"); 
    li.text(function(d) { return d; }); 
} 

, şunları söyleyebilirsiniz:

d3.select("#list").call(list, [0, 1, 2, 3, 4]); 

Sonra sonra istersen güncelleştirme, şunları söyleyebilirsiniz: Eğer (ve yöntem zincirleme gerekmez) tercih ederseniz

d3.select("#list").call(list, [5, 3]); 

, sen selection.call olmadan bu yazabilirsiniz:

+0

Benim durumum biraz daha karmaşık. Verilerim karmaşık nesneler. Eğer data_arr = [obj1, obj2, obj3] varsa; ve ben obj1.field = newvalue; Ne olur, tekrar söylemek isterim? D3.select ("# mylist") yapmak zorunda mıyım? SelectAll ('li'). Remove(); ve "liste" işlevini tekrar çağırır mısınız? Daha iyi bir yolu var mı? – Tony

+0

Hayır, tüm li öğelerini kaldırmanız gerekmez; veri katılımı yalnızca çıkan öğeleri kaldırır. Herhangi bir nesne eklemeden veya çıkarmadan verilerinizi güncellerseniz, ekranı güncelleştirmek için sadece d3.select ("# liste") çağrısı yapabilirsiniz (liste, veri). Bu durumda giriş ve çıkış seçimi boş. – mbostock

+0

Ancak, nesnenin belirli bir alanı değiştiyse, #innerDiv içeriğini güncellemez. Yoksa yanlış bir şey mi yapıyorum? D3.select ("# list"): çağrı (liste, veri), #innerDiv içeriğini d.field'ın yeni değeriyle güncellemeli mi? – Tony

İlgili konular