2012-05-22 6 views
8

मैं डेटा के आधार पर सामग्री उत्पन्न करने के लिए d3.js लाइब्रेरी का उपयोग कर रहा हूं।d3.js में डेटा को पुन: स्थापित करने का सबसे अच्छा तरीका

यहां एक सरलीकृत उदाहरण है।

data_arr = [0,1,2,3,4]; 
d3.select("#mylist").selectAll('li').data(data_arr).enter().append("li").html(
    function(d) 
    { 
     var element = document.createElement('div'); 
     element.innerHTML = '<div id="innerDiv">' + d + '</div>'; 
     return element.innerHTML; 
    }); 

यदि मैं अपनी सरणी बदलता हूं, उदाहरण के लिए नया डेटा [5,3] है। नए एचटीएमएल को पुनर्निर्मित करने और दिखाने का सबसे अच्छा तरीका कैसा है? क्या मुझे एक ही वाक्य को फिर से कॉल करना है या क्या यह एक बेहतर तरीका है?

अधिक जटिल डेटा संरचना के मामले पर विचार करें। अर्थात

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

और

element.innerHTML = '<div id="innerDiv">' + d.field + '</div>'; 

अगर मैं ऐसा obj1.field = 'newValue' क्या होता है। पुनर्जन्म कैसे किया जाता है?

धन्यवाद!

उत्तर

18

फ़ंक्शन का उपयोग करें। उदाहरण के लिए, यहाँ एक समारोह है कि तार की एक सरणी से एक सूची से स्थापित हो जाएगा है:

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

अब अगर आप अपनी सूची को प्रारंभ करना चाहते हैं, तो आप कह सकते हैं:

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

फिर बाद में आप करना चाहते हैं अद्यतन, आप कह सकते हैं:

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

यदि आप चाहें, (और आप विधि श्रृंखलन की जरूरत नहीं है), तो आप selection.call बिना यह लिख सकते हैं:

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

मेरा परिदृश्य थोड़ा और जटिल है। मेरा डेटा जटिल वस्तुओं हैं। अगर मेरे पास data_arr = [obj1, obj2, obj3] है; और मैं obj1.field = newvalue बदलता हूं; क्या होता है अगर मैं पुनर्जीवित करना चाहता हूं? क्या मुझे d3.select ("# mylist") बनाना है। SelectAll ('li')। हटाएं(); और फिर से "सूची" समारोह पर कॉल करें? क्या कोई बेहतर तरीका है? – Tony

+0

नहीं, आपको सभी ली तत्वों को हटाने की आवश्यकता नहीं है; डेटा-जॉइन केवल बाहर निकलने वाले तत्वों को हटा देता है। यदि आप किसी भी ऑब्जेक्ट को जोड़ने या हटाने के बिना अपना डेटा अपडेट करते हैं, तो आप डिस्प्ले को अपडेट करने के लिए 'd3.select ("# list") कॉल कर सकते हैं। (सूची, डेटा)' कॉल करें। इस मामले में प्रवेश और निकास चयन खाली हैं। – mbostock

+0

लेकिन ऐसा करने से #innerDiv सामग्री को अपडेट नहीं किया जाता है यदि ऑब्जेक्ट का कोई विशिष्ट फ़ील्ड बदल गया है। या मुझ से कुछ गलत हो रहा है? D3.select ("# list") चाहिए। कॉल (सूची, डेटा) d.field के नए मान के साथ #innerDiv की सामग्री को अपडेट करें? – Tony

संबंधित मुद्दे