GWT - 在模块之间保留小部件实例

时间:2014-11-17 09:37:13

标签: gwt static widget

我正在开发一个由3个模块组成的应用程序。

用户可以开始网络聊天(作为小部件实现),然后浏览模块。我希望在导航过程中保留网络聊天小部件。

我在包含当前实例的窗口小部件中添加了一个静态字段,但它只在我保留在同一模块中时才会保留。如果我更改模块,则会从头开始重新创建窗口小部件。

有没有办法定义具有应用范围的对象?

2 个答案:

答案 0 :(得分:0)

更好的解决方案(比保持全局状态)是使用依赖注入并将窗口小部件注入所有相关视图。

使用杜松子酒看起来像这样:

@Singleton
public class CommonWidget {
}

public class View1 {
    @Inject
    public View1(CommonWidget widget) {
    }
}

public class View2 {
    @Inject
    public View2(CommonWidget widget) {
    }
}

现在,widgetView1中的View2指向同一个小部件。 问题是在使用此widget时必须小心 - 请记住,您只能向DOM添加一次小部件,因此在View2中添加小部件之前,您必须将其从{View1中删除。 1}}。

我认为相反以这种方式共享窗​​口小部件,您应该在两个聊天窗口小部件之间共享消息,或者更好地将聊天窗口小部件移动到视图之上(字面或比喻),这样只有一个实例。

当然,设置杜松子酒还有更多步骤,但您可以在the docs中了解它们。

答案 1 :(得分:0)

您可以在入口点类(#onModuleLoad)中创建任何窗口小部件,然后从任何需要它的活动中引用/调用此窗口小部件。但是,我只会在两种情况下推荐这种解决方案:

  1. 窗口小部件是整个应用程序或应用程序的一部分(例如顶层菜单,主面板)的容器,它始终在屏幕上可见,因此您不需要在UI中添加/删除它 - 您只需叫它改变它的状态。

  2. 小部件是一个弹出式面板或类似的(例如确认对话框,错误通知等),因此在不同的活动/视图中重复使用它不会导致任何问题。

  3. 您可能需要查看Activities and Places设计模式。它支持大多数典型的导航方案,您可以在同一个应用程序(容器)小部件中从一个活动/视图移动到另一个活动/视图。

    更新:

    这是GWT文档中关于使用多个模块的引用:

      

    如果您的应用程序中有多个GWT模块,则有两个   加载它们的方法。

         
        
    1. 单独编译每个模块并将每个模块包含在一个单独的模块中    HTML主机页面中的标记。
    2.   
    3. 创建顶级模块XML   包含您要包含的所有模块的定义。编   顶级模块,用于创建一组JavaScript输出。
    4.         

      在   第一种方法似乎最容易也是最明显的。然而   第二种方法将导致更好的最终用户表现。该   加载多个模块的问题是每个模块都必须   由最终用户的浏览器单独下载。另外,每个   模块将包含GWT库代码的冗余副本,并且可以   在事件处理期间可能会相互冲突。第二   强烈建议采用这种方法。