0

问题很简单,但可能无法解决?至少对我来说 :/

情况:假设我有一个动态页面系统,其中服务器提供额外的自包含 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 和重新映射器,但这对我来说太麻烦了。

如果有人提出更好的主意,我仍然持开放态度,但我只想提供一些我的发现的内部信息,以便其他人可以从我浪费的时间中受益;)

4

3 回答 3

0

不久前,我创建了一个简单的原型实现来将 Object 实例共享给其他 GWT 模块。您可以在https://code.google.com/p/gwt-plug/上找到代码。是的,正如您所描述的,传输 Java 对象是一个问题。据我记得,您只能传输原始值(int、float、...)、字符串和 JavaScriptObject。但是 JavaScriptObjects 是一个很好的可能性

于 2013-08-03T20:12:32.953 回答
0

正如您已经发现的那样,在单独编译的 GWT 模块之间进行通信有些挑战,因为一切都被混淆了。虽然通过 javascript、JSNI、JSO 和 JSON 是可能的。

  1. 您可以使用 JSNI 通过 javascript 直接在 $wnd 对象上创建通信挂钩。某种事件总线方法会起作用。

  2. 您可以使用 JSON 来传递复杂的对象。

  3. 您可以使用 JSO(JavaScript 覆盖)来使用和操作每个分散模块中的 JSON。

  4. 将所有这些放在一起,您最终会得到一个迷你框架库模块,您将在希望彼此通信的各种 GWT 模块之间共享该模块。他们每个人都将继承公共框架模块并以自己的混淆形式进行编译,但由于他们使用 javascript 和 JSON 作为公共语言,他们不必担心混淆。

说得通?

于 2013-08-03T22:35:11.410 回答
0

正如 xsee 的回答中所解释的,您可以使用 JSNI 从 GWT 创建一个钩子

为此,请查看非常有用的项目http://code.google.com/p/gwt-exporter/

于 2013-08-04T18:20:30.653 回答