Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT-在模块之间保留小部件实例_Gwt_Static_Widget - Fatal编程技术网

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

GWT-在模块之间保留小部件实例,gwt,static,widget,Gwt,Static,Widget,我正在开发一个由3个模块组成的应用程序 用户可以启动web聊天(作为小部件实现),然后浏览模块。我想在导航期间保留web聊天小部件 我在包含当前实例的小部件中添加了一个静态字段,但它仅在我保持在同一模块中时才会持久化。如果我更改了模块,小部件将通过scratch重新创建 有没有一种方法可以定义具有应用程序范围的对象?一个更好的解决方案(比保持全局状态)是使用依赖项注入并将您的小部件注入所有相关视图 用杜松子酒看起来像这样: @Singleton 公共类CommonWidget{ } 公共类视图1

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

用户可以启动web聊天(作为小部件实现),然后浏览模块。我想在导航期间保留web聊天小部件

我在包含当前实例的小部件中添加了一个静态字段,但它仅在我保持在同一模块中时才会持久化。如果我更改了模块,小部件将通过scratch重新创建

有没有一种方法可以定义具有应用程序范围的对象?

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

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

@Singleton
公共类CommonWidget{
}
公共类视图1{
@注入
公共视图1(CommonWidget小部件){
}
}
公共类视图2{
@注入
公共视图2(CommonWidget小部件){
}
}
现在,
View1
View2
中的
widget
指向同一个小部件。 问题是,在使用此
小部件时必须小心-请记住,您只能向DOM添加一次小部件,因此在
视图2
中添加小部件之前,必须将其从
视图1
中删除

我认为,与其以这种方式共享小部件,不如在两个聊天小部件之间共享消息,或者更好的是,将聊天小部件移动到视图的“上方”(字面或比喻),这样就只有一个实例


当然,设置gin还有更多的步骤,但您可以在中阅读。

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

  • 小部件是整个应用程序或应用程序的一部分(例如顶部菜单、主面板)的容器,在屏幕上始终可见,因此您不需要从UI中添加/删除它,只需调用它来更改其状态

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

  • 您可能想看看设计模式。它支持大多数典型的导航场景,即在同一个应用程序(容器)小部件中从一个活动/视图移动到另一个活动/视图

    更新:

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

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

  • 分别编译每个模块,并使用单独的 在HTML主机页中添加标记
  • 创建顶级模块XML 包含要包含的所有模块的定义。编写 创建一组JavaScript输出的顶级模块
  • 第一种方法似乎最简单、最明显。但是, 第二种方法将带来更好的最终用户性能。这个 加载多个模块的问题是,每个模块都必须 由最终用户的浏览器单独下载。此外,每个 模块将包含GWT库代码的冗余副本,并且可能 在事件处理过程中可能相互冲突。第二 强烈建议采用这种方法


    小部件已经只有一个实例了。我在小部件中维护一个静态引用。如果“null”,则创建一个新实例,否则返回现有实例。问题在于,静态字段的作用域似乎是模块,而不是应用程序。@Algia的方式与Java的工作方式不同(不包括类加载器技巧),Java在GWT中运行时的工作方式也不同。您必须表现得好像有一个基于GWT的类加载器;)。抱歉@ColinAlworth,但我不理解你的评论。在Java中,静态字段可用于整个应用程序(有人甚至向JVM建议)。因此,我希望GWT也能做到(几乎)相同。@Algia我是说,对于给定的已编译GWT模块,它的行为类似于JVM——静态实例是一个实例,所有对象,无论它们定义在何处(在该模块中),都可以看到它。但是,就像两个不同的运行JVM看不到彼此的静态成员一样,两个不同的运行(即未编译在一起)模块也看不到彼此的实例。您可以编写一些代码使它们通信,但切换到新的JVM(重新启动应用程序或启动第二个应用程序)意味着旧对象不会保留。请注意,这不同于一个模块继承另一个模块。我有3个不同的入口点,即使在从一个入口点导航到另一个入口点时,也需要保留小部件。当您导航到另一个入口点时,对于浏览器来说,这是一个全新的页面-DOM被清除,您的所有小部件、数据等都将丢失。@AndreiVolgin,你的评论不正确。当加载多个模块时,可以有多个入口点。考虑一个情况,当您有父模块和子模块时。如果这些模块有入口点-它们都将被执行,而不清理DOM。@Andrew-您可以这样做,但这不是一个好主意。大多数GWT应用程序被组织为具有单个入口点的单个模块,该入口点根据需要继承其他模块。看见我还引用了GWT文档更新了我的回复。Andrei,在我的评论中,我引用了第二种方法,在你的回答中引用了。我不明白,为什么这是个坏主意。