2011-01-27 39 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

相关问题