2012-09-27 16 views
7

जेएसएफ में, जावास्क्रिप्ट को एकीकृत करने के लिए "दाएं" और "साफ" तरीका क्या होगा जो एक समग्र-घटक में एकीकृत है? मैं Unobtrusive JavaScript का प्रशंसक हूं, और एचएसएस से जेएस से सीएसएस से अलग हूं। जितना संभव हो उतना कम क्विर्क रखने का एक अच्छा तरीका क्या होगा?जेएसएफ समग्र घटक में जावास्क्रिप्ट को एकीकृत करें, स्वच्छ तरीका

<composite:interface> 
    // ... 
</composite:interface> 

<composite:implementation> 
    // ... 
    <script> initSomething('#{cc.clientId}'); </script> 
</composite:implementation>  

क्या मुझे पसंद नहीं है है, language A उपयोग करने के लिए language B उत्पन्न करने के लिए: यह क्या मैं अब तक सबसे ज्यादा पसंद है। असल में यह ईवेंट हैंडलर और सामान के लिए भी जाता है। मेरा पसंदीदा उन हैंडलर को <insert favorite DOM JavaScript library here> के माध्यम से संलग्न करना होगा। क्या यह संभव है? आप इस तरह के एकीकरण कैसे करते हैं?

+0

मुझे यकीन नहीं है कि मैं आपकी ठोस समस्या/प्रश्न को समझता हूं। आप उदाहरण के लिए jQuery का उपयोग कर सकते हैं। प्राइमफेस और रिचफेस जैसे लोकप्रिय जेएसएफ घटक पुस्तकालय भी कवर के तहत jQuery का उपयोग करते हैं। – BalusC

+1

हां, ज़ाहिर है। लेकिन किसी भी तरह मुझे उस डोम तत्व का संदर्भ पुनर्प्राप्त करना होगा। एक आईडी का उपयोग करना यह सुनिश्चित करने का एकमात्र तरीका होगा कि यह अद्वितीय है (यह कि आईडी के बाद क्या है)। अब मैं जावास्क्रिप्ट का कुछ टुकड़ा उत्पन्न नहीं करना चाहता हूं, लेकिन फिर मैं एक डोम नोड कैसे प्राप्त करूं? –

उत्तर

7

मैं कहूंगा कि आपके पास जो कुछ भी है, वह आपको सबसे अच्छा है, बशर्ते कि आप बिल्कुल सकारात्मक हैं कि HTML तत्व की प्रकृति इतनी अनूठी है कि आपको इसे हर बार फिर से आईडी द्वारा चुनने की ज़रूरत है ।

एचटीएमएल प्रतिनिधित्व अद्वितीय (मुझे लगता है कि एक Facelets टेम्पलेट कल्पना नहीं कि कर सकते हैं या शामिल फ़ाइल शीर्षक, मेनू, पाद लेख, आदि जैसे आवेदन-व्यापी अद्वितीय HTML तत्वों शामिल हो सकता है, लेकिन एक समग्र घटक पुन: उपयोग किया जा सकता है जो है एक बार में कई बार? मैं जीवन के लिए कल्पना नहीं कर सकता कि), तो आप उस पर एक अद्वितीय क्लासनाम और हुक प्रारंभिक उपयोग करने पर भी विचार कर सकते हैं।

उदा। /resources/composites/yourComposite.xhtml

<cc:implementation> 
    <h:outputScript library="composites" name="yourComposite.js" target="head" /> 
    <div id="#{cc.clientId}" class="your-composite"> 
     ... 
    </div> 
</cc:implementation> 
/resources/composites/yourComposite.js में (यह मानते हुए आप jQuery का उपयोग कर रहे है कि)

var $yourComposites = $(".your-composite"); 
// ... 

साथ

आप कर सकते हैं यदि आवश्यक हो तो उद्धरण एक jQuery.each() में उनमें से प्रत्येक के लिए स्वत: जनरेट HTML तत्व ID:

$yourComposites.each(function(index, yourComposite) { 
    var id = yourComposite.id; 
    // ... 
}); 
+0

आपके इनपुट के लिए धन्यवाद। आप सही हैं, अधिकांश भाग अद्वितीय नहीं होंगे और इससे कोई फर्क नहीं पड़ता कि वे हैं (यानी हेडर, मेनू, पाद लेख)। लेकिन मेरा सिरदर्द शुरू होता है, जब मैं AJAX के माध्यम से घटकों को पुनः लोड या सम्मिलित करता हूं। मैं एक निश्चित वर्ग नाम वाले प्रत्येक घटक को फिर से शुरू करने के लिए नहीं, और नहीं चाहता हूं। सरल विकल्प एक अद्वितीय आईडी होगा, या याद रखने के लिए कुछ ध्वज सेट करना होगा कि कौन से घटक पहले शुरू किए गए थे। बाद वाले को कुछ कोड की आवश्यकता होती है, गंदा लगता है, वास्तव में सुरक्षित नहीं है और कुछ ओवरहेड जोड़ता है। आपने इस तरह की समस्या को कैसे हल किया? –

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