问题很简单,但可能无法解决?至少对我来说 :/
情况:假设我有一个动态页面系统,其中服务器提供额外的自包含 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 和重新映射器,但这对我来说太麻烦了。
如果有人提出更好的主意,我仍然持开放态度,但我只想提供一些我的发现的内部信息,以便其他人可以从我浪费的时间中受益;)