【问题标题】:GWT: Multiple Script Instances CommunicationGWT:多脚本实例通信
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      有意义吗?

      【讨论】:

        【解决方案3】:

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

        为了做到这一点,看看非常有用的项目http://code.google.com/p/gwt-exporter/

        【讨论】:

        • 我喜欢那个项目。很高兴找到 bsorrentino!
        猜你喜欢
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        相关资源
        最近更新 更多