2010-01-29 21 views
5

यदि मैं जीडब्ल्यूटी के साथ एमवीपी पैटर्न का उपयोग कर रहा हूं, जैसा कि जीडब्ल्यूटी आर्किटेक्चर में सर्वोत्तम अभ्यास 200 9 से Google I/O से बात करते हैं, लेकिन जानकारी को कई विगेट्स में फैला है, तो मूल्य वस्तु कैसे होनी चाहिए आबादी हो?एमवीपी और जीडब्ल्यूटी विजेट्स के बीच संचार

कहें कि मेरे पास एक संपादनपर्स व्यू/प्रेजेंटर है, एक एडिटपेट व्यू/प्रेजेंटर और एक एडिट एड्रेस व्यू/प्रेजेंटर है और अंतिम दो संपादनपर्स व्यू में पैनल के हिस्से के रूप में विजेट हैं। इन के साथ मैं निम्नलिखित वर्ग है:

class PersonDetails { 
    private PetDetails pet; 
    private AddressDetails addressDetails; 

    // ... 
} 

PetDetails और AddressDetails उदाहरण चर उनके प्रस्तोता समकक्षों में कामयाब रहे हैं। जब उपयोगकर्ता EditPersonView में "सहेजें" बटन पर क्लिक करता है, तो विजेट्स के बीच संचार कैसे किया जाना चाहिए ताकि व्यक्ति विवरण अपने बच्चे के विजेट से जानकारी से भरा हो?

उत्तर

1

मुझे कुछ अलग-अलग जीडब्ल्यूटी अनुप्रयोगों में एक ही समस्या का सामना करना पड़ा है जिसे मैंने रे रयान के दृष्टिकोण का उपयोग करके डिजाइन किया है। मेरा पसंदीदा समाधान सिंगलटन "सत्र ऑब्जेक्ट" बनाना है जो एप्लिकेशन के उस हिस्से की स्थिति को संग्रहीत करता है। अपने उदाहरण में, यह इस प्रकार दिखाई देंगे:

interface EditPersonSession { 

    void fetchPerson(PersonId id); 
    PersonDetails getCurrentPersonDetails(); 
    void updatePersonDetail(PersonDetail<?> detail); 
    void updatePetDetail(PetDetail<?> detail); 
    void updateAddressDetail(AddressDetail<?> detail); 
    void save(); 

} 

तीनों प्रस्तुतकर्ताओं सत्र वस्तु (शायद जिन द्वारा इंजेक्शन) के लिए एक संदर्भ होते हैं। जब भी यूआई (व्यू) उपयोगकर्ता द्वारा छेड़छाड़ की जाती है, तो उस दृश्य से जुड़े प्रस्तुतकर्ता तुरंत राज्य को साझा सत्र ऑब्जेक्ट पर धक्का देता है। उदाहरण के लिए, EditAddressPresenter अंदर:

view.getStreetNameTextBox().addValueChangeHandler(new ValueChangeHandler() { 

    void onValueChange(ValueChangeEvent<String> event) { 
     editPersonSession.updateAddressDetail(new StreetNameAddressDetail(event.getValue())); 
    } 

} 

जब यह बचाने के लिए समय आ गया है, राज्य वस्तु सर्वर से राज्य को बचाने के लिए कहा जाता है। इस बिंदु पर, सत्र ऑब्जेक्ट में डेटा के अद्यतित प्रतिनिधित्व होते हैं, और इसे एक साथ में सहेज सकते हैं। तो, EditPersonPresenter में:

view.getSaveButton().addClickHandler(new ClickHandler() { 

    void onClick(ClickEvent event) { 
     editPersonSession.save(); 
    } 

} 

इस तरह, प्रस्तुतकर्ताओं एक दूसरे के लिए किसी भी संदर्भ होते हैं की जरूरत नहीं है, लेकिन सर्वर से लगातार जानकारी भेज सकते हैं। यदि प्रस्तुतकर्ताओं को यह पता होना चाहिए कि वे जो जानकारी प्रदर्शित करते हैं उन्हें अपडेट किया गया है (या तो अन्य प्रस्तुतकर्ताओं द्वारा, या सर्वर द्वारा), सत्र ऑब्जेक्ट ईवेंट ईवेंट (साझा सिंगलटन हैंडलर प्रबंधक) पर फायरिंग ईवेंट द्वारा उन्हें सूचित कर सकता है। प्रस्तुतकर्ता सत्र ऑब्जेक्ट से सबसे वर्तमान व्यक्ति विवरण खींच सकते हैं।

+0

हम्म .. दिलचस्प समाधान। जो मैं पागल नहीं हूं वह यह तथ्य है कि मुझे उन सभी तत्वों के लिए मूल्य परिवर्तन हैंडलर पंजीकृत करने की आवश्यकता होगी जो मुझे संवाद का एक स्नैपशॉट प्रतिनिधित्व नहीं दे सकते हैं जैसे कि संपादन करते समय मुझे मूल्य प्राप्त करना था PersonSession.save() विधि कॉल । लेकिन मुझे लगता है कि यह करेगा। धन्यवाद! :) – Arthur

+0

कोई समस्या नहीं :)। जब तक आप सुनिश्चित करते हैं कि आप प्रस्तुतकर्ताओं से मूल्यों को सत्र ऑब्जेक्ट में धक्का देते हैं जैसे ही विचारों में कोई भी मूल्य बदलता है, सत्र ऑब्जेक्ट को हमेशा कॉल में डेटा का अद्यतित प्रतिनिधित्व होना चाहिए जब आप कॉल करते हैं बचाना()। – Daniel

3

यदि आप Google IO 200 9 से रे रयान द्वारा presentation के पृष्ठ 42 को देखते हैं तो आपको अपने प्रश्न का समाधान मिलना चाहिए। आप "इवेंट बस" (HandlerManager का साझा उदाहरण) का उपयोग करते हैं और अपने कस्टम PetDetailsChangedEvent ईवेंट को आग लगाते हैं और उस ईवेंट को अपने बच्चे के विजेट (पेज 45) से सुनते हैं। साथ ही, याद रखें कि decoupling, आदि बहुत अच्छा है और सभी, कुछ युग्मन एक बुरी चीज नहीं है और वास्तव में कमजोर युग्मित होने के लिए मजबूर करने की कोशिश करने से बेहतर समाधान हो सकता है - आरआर उस प्रस्तुति में खुद कहता है :)

+0

हाँ, मैं देख सकता हूं कि किसी ईवेंट के माध्यम से सर्वर से प्रतिक्रिया का प्रचार कैसे किया जा सकता है। हालांकि, मुझे दूसरी तरफ एक समाधान खोजने में कठिनाई हो रही है, जो विभिन्न विगेट्स से जानकारी एकत्र कर रहा है और फिर "सेवस्पर्सन" आरपीसी कॉल भेजता है। उदाहरण के लिए दृश्य पर getName() विधि के साथ मुझे मिले एकमात्र उदाहरण बहुत ही छोटे हैं। – Arthur

+0

आप क्लाइंट पर एक ही इवेंट बस के साथ अलग-अलग ऑब्जेक्ट्स को सिंक में रख सकते हैं।ऑब्जेक्ट में प्रत्येक परिवर्तन (उदा। एक सेटटर विधि के माध्यम से) एक "मॉडल चेंज" ईवेंट ट्रिगर करें, जिसमें सभी शामिल विजेट्स सुनें। फिर वे वस्तु को अद्यतन करते हैं। जब तक आपको "सेवपर्सन" कॉल भेजना होगा, वे सभी सिंक हो जाएंगे। – Bluu

+1

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

0

मैं इस निष्कर्ष पर भी आया हूं कि मेरे पास एक मॉडल हो सकता है जो प्रत्येक प्रस्तुतकर्ता से मेल खाता हो। तो एक पेटविड्ज एक पालतू उदाहरण बना सकता है और एक व्यक्ति विजिट एक व्यक्ति उदाहरण बना सकता है। पर्सनल विजिट में एक या अधिक पेटविड्ज हो सकते हैं जो बदले में है कि व्यक्ति वर्ग में पालतू उदाहरणों की एक सूची हो सकती है।

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