2009-08-06 14 views
8

Hy, में सशर्त प्रदर्शन मैं अपने विकेट टेम्पलेट का एक निश्चित हिस्सा (उदाहरण के लिए एक div) (केवल अगर मैं इसे भरने के लिए डेटा है उदाहरण के लिए) केवल एक निश्चित शर्त के तहत प्रदर्शित करना चाहते हैं। समस्या यह है:विकेट: टेम्पलेट

यदि मुझे डेटा मिला तो मैं केवल पैनल (div भरना) जोड़ता हूं, हर बार जब मैं डेटा के बिना पृष्ठ को कॉल करता हूं तो अपवाद फेंक दिया जाता है (क्योंकि संदर्भित विकेट-आईडी को जोड़ा नहीं जाता है घटक-वृक्ष)।

मेरे मन में आने वाला एकमात्र समाधान था यदि कोई डेटा नहीं है तो एक खाली पैनल जोड़ना था। यह एक आदर्श समाधान नहीं है क्योंकि मुझे जावा कोड में कुछ अनियंत्रित कोड और मेरे प्रस्तुत एचटीएमएल में कई खाली divs मिला है।

तो क्या एक शर्त के तहत केवल विकेट-टेम्पलेट के कई हिस्सों को शामिल करने का बेहतर समाधान है?

उत्तर

4

हालांकि यह एक पुराने सवाल यहाँ है एक और समाधान हो सकता है: wicket:enclosure (और this)

अद्यतन: अब मैं (jetwick के लिए) मेरे स्वयं के द्वारा इस कार्यक्षमता की जरूरत है। मैं WebMarkupContainer एक का उपयोग कर रहा loggedIn राज्य के लिए और loggedOut राज्य के लिए एक और सही दृश्यता सेट:

if (loggedIn()) {    
    WebMarkupContainer loggedInContainer = new WebMarkupContainer("loggedIn"); 
    //## do something with the user 
    User user = getUserSomeWhere(); 
    loggedInContainer.add(new UserSearchLink("userSearchLink")); 
    add(loggedInContainer); 
    add(WebMarkupContainer("loggedOut").setVisible(false)); 
} else { 
    add(new WebMarkupContainer("loggedIn").setVisible(false)); 
    WebMarkupContainer loggedOutContainer = WebMarkupContainer("loggedOut"); 
    loggedOutContainer.add(new LoginLink() {...}); 
    add(loggedOutContainer); 
} 

मेरे लिए इस बात का लाभ यह है कि मैं // ## में चिह्नित लाइन और संलग्न में एक NullpointerExc रोकने है विकेट की सुविधा इस मामले में मुझे लगता है कि मेरे लिए और अधिक बदसूरत लगेगा।

+0

धन्यवाद, यह एक अच्छा समाधान की तरह लगता है! – theomega

+0

मेरी अद्यतन जवाब – Karussell

+0

@Karussell देखते हैं, वहाँ एक 'new' सही ऊपर' else' लापता है? – aioobe

1

मुझे लगता है कि यही कारण है कि EmptyPanel है। अपने कोड के बारे में जानने के बिना मैं केवल इतना कह सकता हूं कि जो कुछ मुझे लगता है कि आप कर रहे हैं वह कुछ है जो मैं AbstractRepeater और Fragment के कुछ बच्चे के संयोजन के साथ करता हूं। यदि आप जो करना चाहते हैं उसके बारे में अधिक बताने के इच्छुक हैं और शायद कुछ कोड भी प्रदान करते हैं, तो मैं जितना कर सकता हूं उतनी मदद करने में मुझे खुशी होगी।

0

आप सेट दृश्य (झूठा) को कॉल कर सकते हैं; उस घटक पर जिसे आप छिपाना चाहते हैं।

3

@miaubiz की तरह, आप सेट विज़िबल (झूठी) को कॉल कर सकते हैं, या यदि आप दृश्यता किसी अन्य राज्य (उदाहरण के लिए भरे फ़ील्ड) के लिए सशर्त है तो आप दृश्यमान() विधि को ओवरराइड कर सकते हैं।

2

यूप, आप ओवरराइड करना चाहते हैं दृश्यमान है। यह अंतिम HTML पृष्ठ पर भी प्रस्तुत करने से दृश्यमान = झूठा HTML मार्कअप रखेगा। इसके अलावा, दस्तावेज़ों के अनुसार (EmptyPanel में उल्लिखित), आप रैपिंग घटक के रूप में WebMarkupContainer का उपयोग कर सकते हैं।

this.add(new SimpleResourceModelLabel(NO_DATA_LABEL){ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean isVisible() { return myList.isEmpty(); } 
    }); 

    final WebMarkupContainer table = new WebMarkupContainer(MY_DATA_TABLE){ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean isVisible() { return !myList.isEmpty(); } 
    }; 
+0

विकेट डॉक्स (https://cwiki.apache.org/WICKET/lifecycle-of-a-wicket-application.html) की ओर से अधिक: Component.render() एक घटक रेंडर करने के लिए इन चरणों का अनुसरण करता है: 1. घटक दृश्यता निर्धारित करें। घटक दिखाई नहीं देता है, RequestCycle का प्रतिसाद NullResponse.getInstance(), एक रिस्पांस कार्यान्वयन कि बस इसके उत्पादन को छोड़ देता है, जो करने के लिए बदल जाता है। – jgormley

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