2012-05-25 10 views
10

मैं क्लोजरस्क्रिप्ट का प्रयोग/सीख रहा हूं। कुछ सर्कल प्रदर्शित करने के लिए उत्कृष्ट d3.js lib के साथ कोड स्निपेट इंटरफेस के बाद। मैक्रोज़ का उपयोग किए बिना थोड़ा वर्बोज़ होने के लिए इसे ढूंढें, क्या इसे अनुकूलित/छोटा करने का कोई तरीका है?क्या यह मूर्खतापूर्ण क्लोजरस्क्रिप्ट माना जाएगा?

(def rdata (atom (array 3 10 12 16 19))) 

(defn update [] 
(let [em (.selectAll (.select js/d3 "svg") "circle") 
    data (.data em @rdata d3/String) 
    enter (.append (.enter data) "circle") 
    yscale (.linear (. js/d3 -scale)) 
    xscale (.linear (. js/d3 -scale)) 
    rscale (.linear (. js/d3 -scale)) 
    ] 
(-> yscale 
    (.domain (array 0 20)) 
    (.range (array 100 200))) 
(-> xscale 
    (.domain (array 0 20)) 
    (.range (array 100 800))) 
(-> rscale 
    (.domain (array 0 20)) 
    (.range (array 50 100))) 
(-> enter 
    (.attr "cx" xscale) 
    (.attr "cy" yscale) 
    (.attr "r" rscale) 
    (.style "fill" "steelblue") 
    (.style "stroke" "black") 
    (.style "stroke-width" "2") 
) 
) 
(.info js/console "rdata: " @rdata) 
) 

धन्यवाद

उत्तर

12

तराजू आप (.linear (.-scale js/d3)) है, जो थोड़ा अधिक संक्षिप्त है लिख सकते हैं प्रारंभ करने के लिए। इसके अलावा, इस कोड स्निपेट में डेटा के लिए एटम का उपयोग करने का कोई कारण नहीं है। आप दृश्य को अपडेट करना चाहते हैं, तो आप नए डेटा एक तर्क के रूप update बल्कि परमाणु परिवर्तनशील और नो-आर्ग अद्यतन fn बुला से गुजर सकता है।

चेनिंग के लिए थ्रेडिंग मैक्रो idiomatic, तो आप वहां अच्छे हैं।

फिर फिर, आप सीधे क्लोजर लाइब्रेरी का उपयोग करने से अधिक मूर्खता प्राप्त नहीं कर सकते हैं; C2 देखें, डी 3 के क्लोजर (स्क्रिप्ट) कार्यान्वयन। (बेशक, प्राथमिक लेखक के रूप में मैं थोड़ा उस पर पक्षपाती हूँ।)

आप डी 3 में ही उपयोग करने की आवश्यकता है, तो आप भी अब पदावनत cljs-d3 आवरण के स्रोत स्किम कर सकते हैं।

मैक्रोज़ एक संक्षिप्त संक्षिप्त इंटरफ़ेस प्राप्त करने का एक तरीका है (उदाहरण के लिए, नक्शा अक्षरों को कई (.attr "key" value) कॉल में विस्तारित करना), लेकिन चेनिंग मैक्रो के अर्थशास्त्र आपको श्रृंखला में किसी भी एफएन इंजेक्ट करने देते हैं, जो जावास्क्रिप्ट मामले से बहुत अलग है । उदाहरण के लिए, आप एक सादा एफएन लिख सकते हैं जो डी 3 चयन और एक विशेषता मानचित्र लेता है और प्रत्येक मानचित्र कुंजी/मान के लिए (.attr d3 k v) पर कॉल करने के लिए doseq का उपयोग करता है।

दरअसल, पिछले वर्ष क्लोजर कॉंज से इस सटीक विषय (उदाहरण के रूप में डी 3 का उपयोग करके) पर 40 minute talk है।

+1

राय और सिर ऊपर सी 2 और डी 3-cljs पर के लिए धन्यवाद केविन। सी 2 दिलचस्प लग रहा है, मैं पूरी तरह क्लाइंट साइड कार्यान्वयन की तलाश में हूं, क्या सी 2/क्लोजरस्क्रिप्ट के साथ ऐसा करना संभव है? – user922621

+0

डेटा के लिए एटम के बारे में, कोड को एक डैशबोर्ड पर विकसित करना चाहते हैं जिसमें क्लाइंट को डेटा को बढ़ाया जा रहा है ... पता नहीं है कि एटम सही दृष्टिकोण है या नहीं? – user922621

+0

एटम राज्य को संभालने के लिए एक महान दृष्टिकोण है। मैं इसे अलग करने की कोशिश करता हूं हालांकि: परमाणु को अपरिवर्तित परिभाषित करें लेकिन जितना संभव हो उतना कम करें - एफएन तर्कों के माध्यम से स्पष्ट रूप से डेटा को पास करना पसंद करते हैं। –

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