我正在(与我的团队)编写一个 GWT 应用程序,它解析并表示一些特定于领域的语言 - 例如,使用文本、视频和 UI 控件播放媒体演示。所以应用程序有一组组件:一个 - 用于保存模型,一个 - 用于控制例程(控制器),当然我们还有视图类。
现在我们遇到了一个问题 - 使其全部可插入,即:
每个插件都必须将自身注册(导出其类等)到核心平台,以便可以使用。
问题:
- How to compile定制的东西
分别地 ?
- How to load插件?
For the second one problem我找到了http://code.google.com/p/gwt-exporter/ http://code.google.com/p/gwt-exporter/,它将 GWT 类导出到外部世界,因此可以从纯 JS 调用它们。
我也有一个想法要创造新模块对于新插件,因此它将被编译为单独的文件(第一个问题).
您有构建此类架构的经验吗?在这种情况下您有一些最佳实践吗?
自 GWT 1.5 以来,我一直在尝试解决同样的问题,每次我想出更优雅的解决方案时,他们都会更改链接器并破坏它。我想出的独立于链接器设计的唯一方法是完全按照您所说的进行操作,并为所有插件创建一个新模块。然后使用 GWT 导出器创建一个插件必须扩展的抽象类,该类具有一个抽象方法,该方法将采用核心传递给它的插件的根元素并填充它。此方法的问题是,所有插件模块都必须在页面初始加载时添加到 DOM,因为从 2.0 开始,iFrame 链接器依赖于页面加载事件,因此动态添加的模块将无法完全加载。因此,您需要将导出的填充方法封装在 runAsync 中,以便在使用模块之前不会下载它们。
Edit:
这是我正在谈论的内容的一个粗略示例。请注意,我已经有几年没有做过任何 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] /cdn-cgi/l/email-protection::getName()();
$wnd.Plugins[name] = $entry([email protected] /cdn-cgi/l/email-protection::load(Ljava/lang/String;));
}-*/;
private static native void unloadPlugin( AbstractPlugin plugin )
/*-{
if ($wnd.Plugins) {
var name = [email protected] /cdn-cgi/l/email-protection::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 );
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)