2011-11-30 17 views
9

में इवेंटबस भूमिका I EventBus का उपयोग करके जीडब्ल्यूटी में इस कूल इवेंट हैंडलिंग के बारे में पढ़ती है और अब तक मुझे यह वाकई पसंद है। लेकिन मैं वास्तव में इस अवधारणा को समझ नहीं पा रहा हूं कि मुझे इसका उपयोग कब करना चाहिए। पुरे समय? क्या मैं इसका उपयोग कर सकता हूं? क्या मुझे इसे घटना से संबंधित सब कुछ के लिए उपयोग करना चाहिए? (एमवीपी में दृश्य और प्रस्तुतकर्ता परत के बीच संचार की तरह? या क्या मैं इसे ऑनसाउसवॉव इवेंट के साथ उपयोग कर सकता हूं? यह कितना हेवीवेट है?)जीडब्ल्यूटी

तो एक प्रश्न में: जीडब्ल्यूटी में इवेंटबस की वास्तव में क्या भूमिका है?

+0

सब कुछ ओवरड्यूड किया जा सकता है :-) – jabal

उत्तर

3

मुझे लगता है कि एक एकल विजेट के एमवीपी भागों के बीच आंतरिक संचार के लिए वैश्विक EventBus का उपयोग करना कुछ हद तक अधिक उपयोग कर रहा है। इससे आपका विजेट इवेंटबस पर निर्भर करेगा। (यदि इवेंटबस कोर जीडब्ल्यूटी में नहीं था जो अधिक obvoiusly अस्वीकार्य होगा।) मैं इवेंटबस को आवेदन के विभिन्न हिस्सों के विभिन्न विगेट्स के बीच संचार माध्यम के रूप में मानता हूं।

2

प्रस्तुतिकर्ता को सीधे दृश्य विधि को कॉल करने के बजाय, दृश्य और प्रस्तुतकर्ता के बीच उपयोग करना बहुत बेकार होगा।

मेरा मानना ​​है कि ईवेंटबस अच्छा है जब घटक एक दूसरे का संदर्भ नहीं देते हैं, उदाहरण के लिए 2 अलग-अलग स्क्रीन के प्रस्तुतकर्ता।

5

आपने शायद यह Google I/O प्रस्तुति देखी है: Google Web Toolkit Architecture: Best Practices For Architecting Your GWT App

इसमें बड़ी जीडब्ल्यूटी परियोजनाओं के साथ काम करने के लिए स्वच्छ तकनीकों को शामिल किया गया है, जैसे आरपीसी कॉल के लिए कमांड पैटर्न, एमवीपी पैटर्न, निर्भरता इंजेक्शन, और इवेंटबस पैटर्न का उपयोग करके डीक्यूप्लिंग घटक का उपयोग करना। अब वहाँ कई GWT चौखटे है कि इन पैटर्न लागू, (gwt-प्रेषण कमान पैटर्न के लिए, एमवीपी के लिए gwt-प्रस्तोता और gwt-मंच, जिन डि के लिए & Guice) हैं, लेकिन बात मैं के बारे में की तरह इवेंटबस अवधारणा यह है कि यह कोर जीडब्ल्यूटी फ्रेमवर्क (HandlerManager) का हिस्सा है, इसलिए मुझे छोटी जीडब्ल्यूटी परियोजनाओं में अतिरिक्त निर्भरताओं को जोड़ने की ज़रूरत नहीं है।

मुझे लगता है कि EventBus अवधारणा अर्थ है कि आप देखें घटकों प्रस्तुतकर्ता घटकों उन कार्यों के बारे में सूचित करने की आवश्यकता है से उपयोगकर्ता इनपुट प्राप्त करने की ज़िम्मेदारी decoupling कर रहे हैं में ऑब्जर्वर डिजाइन पैटर्न से संबंधित है। मुद्दा यह है कि आपकी लिस्टबॉक्स चीज़ को अपने राज्य में बदलाव में रुचि रखने वाले सभी घटकों के बारे में नहीं पता है, यह सिर्फ इवेंटबस को एक घटना को आग लगती है, और इच्छुक घटक उस घटना और कार्य को प्राप्त करेंगे, हालांकि वे चाहते हैं।

मुझे नहीं लगता कि आपको हमेशा हैंडलर प्रबंधक उदाहरण के माध्यम से चीजें करना है। मान लें कि आपके पास कस्टम DateRangePicker विजेट है, जो उपयोगकर्ताओं को कस्टम दिनांक सीमा चुनने देता है। जब भी कोई तिथि सीमा उठाया जाता है, विजेट अपने onSomethingChanged() विधि में कुछ इस तरह कर सकते हैं:

NativeEvent event = Document.get().createChangeEvent(); 
DomEvent.fireNativeEvent(event, this); 

तब घटकों दिनांक सीमा का चयन परिवर्तन में रुचि रखने वाले सिर्फ DateRangePicker विजेट उदाहरणों को हाथ के बल्लेबाज कॉलबैक रजिस्टर कर सकते हैं।

dateRangePicker.addDomHandler(new ChangeHandler(){ 
    @Override 
    public void onChange(ChangeEvent event) { 
     refresh(); 
    } 
}, ChangeEvent.getType()); 

मुझे लगता है कि यह एक अच्छा शिथिल युग्मित डिजाइन है और यह एक HandlerManager उदाहरण का उपयोग नहीं करता।

एक खराब डिज़ाइन किसी घटना को फायर करने की बजाय DateRangePicker की SomingChange() विधि में सभी रुचि घटक के refresh() विधियों को कॉल करना होगा। (या इससे भी बदतर: सभी रीफ्रेश() - एसएस, डेटरेंज पिकर ऑब्जेक्ट के सबकंपोनेंट की ऑनमिंग चेंज() विधियों को कॉल करना।)