【发布时间】:2013-08-03 16:34:59
【问题描述】:
问题很简单,但可能无法解决? 至少对我来说:/
情况: 假设我有一个动态页面系统,其中服务器提供了额外的自包含 GWT 模块的副本。这意味着客户端的主 GWT 实例应该管理新传入的 GWT 脚本,这些脚本只是由主实例本身使用标签添加的。 现在主 GWT 实例需要以最简单(GWT 内部)的方式与新创建的脚本实例进行通信。
那么什么是不可能的:如果不是绝对需要的话,在双方都编写愚蠢的 JSNI 包装器。
我想出的解决方案是: 使一个模块两者都使用,包括一个通用接口,例如:
package com.whatever.interfaces;
public interface Communication {
void showMessage(String message);
}
所以现在两者都将继承此模块并知道定义。 主客户端现在将加载动态 JS 并注册通信的实现,动态的将使用它。我尝试使用 setPropertyObject 将引用存储在 $wnd 和元素上。在 $wnd 上,它们为空,这可能/可能与 GWT Iframing 相关?例如,对于 RootPanel 元素上的属性,将引发 ClassCastException。
有什么好办法遇到这种情况吗?我的另一个想法是使用 JSNI 调用接口作为桥模块上的实现,但我不确定这是否是一个好方法。
感谢您的帮助,谢谢。
编辑: 好吧,我几乎得出结论,这是不可能的。 即使您可能在某处使用了相同的接口,它们将是它自己的实例,用于编译的不同模块,即使使用相同的模块作为共同点。 使用 JSNI 的方法当然是有可能的,但如果不将所有属性映射到真正的 JS 对象并重新映射回来,就不行。这意味着您不能像您可能习惯的那样传递复杂的 Java 对象。我的结论是,使用 CodeGenerators,您可以为这两个模块自动构建 JSNI Wrappers 和重新映射器,但这对我来说太麻烦了。
如果有人提出更好的想法,我仍然愿意,但我只是想提供一些我的发现的内部信息,以便其他人可以从我浪费的时间中受益;)
【问题讨论】:
标签: java gwt communication instances