我正在开发一个由3个模块组成的应用程序。
用户可以开始网络聊天(作为小部件实现),然后浏览模块。我希望在导航过程中保留网络聊天小部件。
我在包含当前实例的窗口小部件中添加了一个静态字段,但它只在我保留在同一模块中时才会保留。如果我更改模块,则会从头开始重新创建窗口小部件。
有没有办法定义具有应用范围的对象?
答案 0 :(得分:0)
更好的解决方案(比保持全局状态)是使用依赖注入并将窗口小部件注入所有相关视图。
使用杜松子酒看起来像这样:
@Singleton
public class CommonWidget {
}
public class View1 {
@Inject
public View1(CommonWidget widget) {
}
}
public class View2 {
@Inject
public View2(CommonWidget widget) {
}
}
现在,widget
和View1
中的View2
指向同一个小部件。
问题是在使用此widget
时必须小心 - 请记住,您只能向DOM添加一次小部件,因此在View2
中添加小部件之前,您必须将其从{View1
中删除。 1}}。
我认为相反以这种方式共享窗口小部件,您应该在两个聊天窗口小部件之间共享消息,或者更好地将聊天窗口小部件移动到视图之上(字面或比喻),这样只有一个实例。
当然,设置杜松子酒还有更多步骤,但您可以在the docs中了解它们。
答案 1 :(得分:0)
您可以在入口点类(#onModuleLoad
)中创建任何窗口小部件,然后从任何需要它的活动中引用/调用此窗口小部件。但是,我只会在两种情况下推荐这种解决方案:
窗口小部件是整个应用程序或应用程序的一部分(例如顶层菜单,主面板)的容器,它始终在屏幕上可见,因此您不需要在UI中添加/删除它 - 您只需叫它改变它的状态。
小部件是一个弹出式面板或类似的(例如确认对话框,错误通知等),因此在不同的活动/视图中重复使用它不会导致任何问题。
您可能需要查看Activities and Places设计模式。它支持大多数典型的导航方案,您可以在同一个应用程序(容器)小部件中从一个活动/视图移动到另一个活动/视图。
更新:
这是GWT文档中关于使用多个模块的引用:
如果您的应用程序中有多个GWT模块,则有两个 加载它们的方法。
- 单独编译每个模块并将每个模块包含在一个单独的模块中 HTML主机页面中的标记。
- 创建顶级模块XML 包含您要包含的所有模块的定义。编 顶级模块,用于创建一组JavaScript输出。
醇>在 第一种方法似乎最容易也是最明显的。然而 第二种方法将导致更好的最终用户表现。该 加载多个模块的问题是每个模块都必须 由最终用户的浏览器单独下载。另外,每个 模块将包含GWT库代码的冗余副本,并且可以 在事件处理期间可能会相互冲突。第二 强烈建议采用这种方法。