2011-01-27 5 views
5

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

अब हम एक समस्या है - यह सब प्लग में सक्षम, के अर्थ में करते हैं:

  • एक कोर प्लगइन है, जो सभी आम सामान बनाने होना चाहिए। यह coer ब्लॉक, एक JavaScript फ़ाइल (हर परिवर्तन के लिए एक)

  • करने की क्षमता कोर कक्षाएं का विस्तार होना चाहिए होना चाहिए कस्टम लिखने - (हर परिवर्तन के लिए एक) और यह संकलन जे एस फ़ाइल को अलग करने के

प्रत्येक प्लगइन को कोर प्लेटफ़ॉर्म पर पंजीकृत होना चाहिए (इसकी कक्षाएं निर्यात करें), इसलिए इसका उपयोग किया जा सकता है।

समस्याएं:

  1. कैसे संकलन करने कस्टम सामान अलग?
  2. कैसे लोड प्लगइन्स?
दूसरा एक समस्या मैं http://code.google.com/p/gwt-exporter/ पाया है, कि बाहरी दुनिया के GWT वर्गों निर्यात के लिए

, ताकि वे शुद्ध जे एस से लागू किया जा सकता है।

इसके अलावा, मैं नए प्लगइन के लिए नया मॉड्यूल बनाने के लिए एक विचार है, तो यह फ़ाइल (पहली समस्या) अलग करने के लिए संकलित किया जाएगा।

क्या आपको इस तरह के वास्तुकला के निर्माण का अनुभव है, क्या आप इस मामले में कुछ सर्वोत्तम अभ्यास करते हैं?

उत्तर

3

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

संपादित करें:

यहाँ मैं क्या बात कर रहा हूँ का एक मोटा उदाहरण है। कृपया ध्यान रखें कि मैंने कुछ वर्षों में कोई भी जीडब्ल्यूटी नहीं किया है और अब तक ऐसा करने का एक बेहतर तरीका हो सकता है।

public final class PluginManager 
{ 
    public static final PluginManager INSTANCE = new PluginManager(); 

    private PluginManager() 
    { 
    } 

    private static native void loadPlugin(AbstractPlugin plugin) 
    /*-{ 
     if (!$wnd.Plugins) { 
      $wnd.Plugins = {}; 
     } 
     var name = [email protected]::getName()(); 
     $wnd.Plugins[name] = $entry([email protected]::load(Ljava/lang/String;)); 
    }-*/; 

    private static native void unloadPlugin(AbstractPlugin plugin) 
    /*-{ 
     if ($wnd.Plugins) { 
      var name = [email protected]::getName()(); 
      delete $wnd.Plugins[name]; 
     } 
    }-*/; 

    private static native JsArrayString getPlugins() 
    /*-{ 
     if ($wnd.Plugins) { 
      return Object.keys($wnd.Plugins); 
     } 
     return undefined; 
    }-*/; 

    public static abstract class AbstractPlugin implements EntryPoint 
    { 
     @Override 
     public final void onModuleLoad() 
     { 
      PluginManager.INSTANCE.loadPlugin(this); 
     } 

     protected final void unload() 
     { 
      PluginManager.INSTANCE.unloadPlugin(this); 
     } 

     protected abstract String getName(); 

     protected abstract void load(String rootPanelId); 
    } 
} 
+0

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

+0

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

+0

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

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