2011-01-27 26 views
5

我正在撰寫(與我的團隊)一個GWT應用程序,它解析並表示一些特定領域的語言 - 例如,用文本,視頻和UI控件播放媒體演示文稿。因此,該應用程序有一組組件:用於保存模型的組件,用於控制例程(控制器)的組件,當然,我們還有用於View的類。如何讓您的GWT應用程序可插入?

現在我們有一個問題 - 讓所有插件能,在這個意義上的:

  • 應該是一個核心插件,它使所有常見的東西。這COER塊必須是一個JavaScript文件(一個用於每個排列)

  • 應該是能力延長核心課程,編寫自定義的 - 並編譯它分開JS文件(一個用於每個排列)

每個插件都必須註冊(將其導出的類等)到自己的核心平臺,因此可以使用它。

問題:

  1. 如何編譯自定義的東西 分開?
  2. 如何到加載插件?

對於第二一個問題我找到http://code.google.com/p/gwt-exporter/,即出口GWT類外的世界,所以他們可以從純JS調用。

另外我有一個想法,創造新的插件新模塊,所以它會被編譯爲獨立文件(第一個問題)。

你有沒有建立這樣的架構的經驗,在這種情況下你有一些最佳實踐嗎?

回答

3

自從GWT 1.5以來,我已經嘗試過這個相同的問題,每次我想出更優雅的解決方案時,他們都會更改鏈接器並將其分解。我提出的獨立於鏈接器設計的唯一方法就是完成你正在討論的內容,併爲永久插件創建一個新模塊。然後使用GWT導出器創建一個抽象類,該類必須擴展插件,該插件必須具有一個抽象方法,該方法將插件的根元素傳遞給核心並填充它。此方法的問題是所有插件模塊必須在頁面的初始加載時添加到DOM,因爲從2.0開始,iFrame鏈接器依賴頁面加載事件,因此動態添加的模塊不會完全加載。因此,您將希望將導出的羣體方法包裝在runAsync中,以便在您使用它們之前不會下載模塊。

編輯:

這是我正在談論的一個粗略的例子。請注意,我在幾年內沒有做過任何GWT,現在可能有更好的方法。

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

哦......謝謝。在這兩個小時裏,因爲我發佈了一個問題,所以我提出了一些解決方案。正如你所說,我已經創建了所有插件應該實現的核心模塊和接口IPlugin。然後我已經添加到HTML文件,我很老,兩個模塊初始化。 雖然這不是最終解決方案,但我認爲這是一個好的開始。 – ajukraine 2011-01-27 18:22:59

相關問題