2011-02-06 5 views
5

मैं एक विकेट न्यूबी हूं। यह सिर्फ विकेट जीवन चक्र की मेरी अज्ञान हो सकती है, इसलिए कृपया मुझे प्रबुद्ध करें! मेरी समझ यह है कि विकेट वेबपेज ऑब्जेक्ट्स को एक बार तत्काल चालू किया जाता है और फिर क्रमबद्ध किया जाता है। इससे मेरे लिए भ्रम का एक बिंदु सामने आया है, नीचे देखें।विकेट: घटक कहां जोड़ें? निर्माता? या पहले से पहले?

वर्तमान में मेरे पास एक टेम्पलेट क्लास है जिसे मैं उपclass करना चाहता हूं।

protected void onBeforeRender() { 
     add(new Label("title", getTitle())); 

     super.onBeforeRender(); 
} 

protected String getTitle() { 
     return "template"; 
} 

उपवर्ग:

protected String getTitle() { 
     return "Home"; 
} 

यह बहुत अच्छी तरह से काम करता है मैं प्रदर्शन कैसे उपवर्ग में टेम्पलेट के व्यवहार को ओवरराइड करने के लिए विकेट डॉक्स में उदाहरण का पालन किया। मेरे लिए यह स्पष्ट नहीं है कि इसके लिए "सर्वोत्तम प्रथाएं" हैं। ऐसा लगता है कि पृष्ठ के लिए प्रत्येक अनुरोध पर पहले सेरेंडर() को बुलाया जाता है, नहीं? ऐसा लगता है कि अगर पृष्ठ पर कुछ भी है तो पहले से ही एक पृष्ठ पर अधिक प्रसंस्करण किया जाएगा। मैं आसानी से अन्य विकेट उदाहरणों के उदाहरण का पालन कर सकता हूं और कन्स्ट्रक्टर में कुछ घटकों को जोड़ सकता हूं जिन्हें मैं ओवरराइड नहीं करना चाहता, लेकिन फिर मैंने घटक तर्क से दो स्थानों में विभाजित किया है, कुछ ऐसा करने में मुझे संकोच नहीं है।

यदि मैं एक घटक जोड़ता हूं जिसे मैं सभी उप-वर्गों में रखना चाहता हूं, तो क्या मुझे इसे निर्माता या ऑनफ्रेंडर() पर जोड़ना चाहिए?

उत्तर

10

घटक है कि एक Page, आप जब घटक पेज में जोड़ा गया है (ताकि component.getPage()null वापस नहीं करता है), घटक है, जो केवल एक बार निर्माण के बाद कहा जाता है जोड़ने के लिए नई onInitialize कॉलबैक ओवरराइड कर सकते हैं नहीं कर रहे हैं के लिए ।

एक और विकल्प add के बजाय addOrReplace() का उपयोग करना है।

किसी कन्स्ट्रक्टर में ओवरराइड विधियों को कॉल करने के लिए, Model या कुछ अन्य देरी कॉलबैक में ऐसा करने का प्रयास करें। अपने उदाहरण में समाधान बहुत सरल है:

public abstract class BasePage extends WebPage { 
    public BasePage() { 
     add(new Label("title", new PropertyModel<String>(this, "title"))); 
    } 
    public abstract String getTitle(); 
} 

एक PropertyModel लेबल की सामग्री को पुनः प्राप्त करने का उपयोग लेबल में मूल्य धकेलने की तुलना में बेहतर है।

4

आपको कन्स्ट्रक्टर में ऐसे नियम के रूप में घटक जोड़ना चाहिए जिसमें बहुत कम अपवाद हैं। असल में, पदानुक्रम (निर्माण) स्थापित करने और इसे प्रस्तुत करने के लिए एक अलग चरण स्थापित करने के लिए एक चरण है। दोनों को मिश्रण करने के लिए इसकी अनुशंसा नहीं की जाती है (और अक्सर प्रतिबंधित)।

+1

धन्यवाद। लेकिन अगर मैं दोनों को मिश्रण नहीं कर सकता, तो टेम्पलेट व्यवहार को ओवरराइड करने का अनुशंसित तरीका क्या है? एक कन्स्ट्रक्टर में अतिरंजित तरीकों को बुलाओ बुरी आदत है। – gmallett

+0

यह तब एक अपवाद होगा :-) – Eelco

0

ऑनफॉररेंडर विधि घटक के दृश्य विकल्प या मॉडल के प्रबंधन को संभालने के लिए उपयोगी है।

+2

इस आवश्यकता के लिए कॉन्फ़िगर() कॉलबैक पर बेहतर उपयोग –