我想创建一个GWT UI,我基本上将有一个单一的HTML页面加载PanelA对象。然后用户将做他们的事情,并最终执行将他们移动到另一个视图/屏幕的操作。
我已经简化了我现有的视图,只包含一个按钮,将用户移动到下一页等简单,我只有2个视图开始。这是我的启动入口
public class StockWatcher implements EntryPoint
{
public void onModuleLoad()
{
final RootPanel rootPanel = RootPanel.get();
rootPanel.add( PanelA.getInstance() );
}
}
这是PanelA类
public class PanelA extends HTMLPanel
{
private static PanelA panel;
private PanelA()
{
super("Panel A");
final RootPanel rootPanel = RootPanel.get();
Button btnNewButton = new Button("Go to panel B");
btnNewButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event)
{
rootPanel.clear();
rootPanel.add( PanelB.getInstance() );
}
});
add(btnNewButton);
}
public static PanelA getInstance()
{
if (panel == null)
{
panel = new PanelA();
}
return panel;
}
}
我的另一个PanelB类与PanelA几乎相同,即带我回到PanelA的按钮我的UI按预期工作。我的问题是,这种单例类型模式是正确或适当的方式来做到这一点吗?是否有一堆单例UI视图可以在主面板上弹出/弹出?此外,通过GWT应用程序处理历史/面包屑跟踪的最佳方法是什么,即允许用户回到以前的屏幕,记住他们可以从PanelA, PanelB或PanelC导航到PanelX
我使用"Activities and Places"来管理所有这些,它在生产环境中已经运行了一年左右了。
https://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces我认为为视图使用单例机制是可以的,但是你必须确保完全重置你存储的任何状态。对我来说,每次用户导航到新位置时创建新视图更容易,然后如果我检测到加载时间或其他问题,则可以追溯地导致视图重用其组件。我建议您先让导航工作,然后再考虑单例(或非)优化。
我推荐活动和场所设计模式。
它涵盖了你在问题中提出的所有问题,以及更多你还没有想到(或没有问过)的问题,如原生浏览器历史管理和在应用程序中添加不同位置书签的能力,处理页面重新加载,有效的内存管理与优化的DOM操作,可扩展性(构建具有数十/数百个视图的应用程序,并以最少的代码重复),可测试性和代码分割(在哪里分割大型应用程序)。
我建议你参考"框架来创建GWT项目,GWTP目前支持的一些特性:
- 通过GIN和Guice进行依赖注入; 简单但功能强大的历史管理机制;
- 支持嵌套演示器;
- 显示器和视图的延迟实例化;
- 轻松高效的代码分割;
- 集成命令模式支持撤销/重做;
所以你的问题和查询就像单例UI视图,处理历史/面包屑跟踪和单例类型模式的最佳方式,将覆盖和一个好的框架将使项目管理变得容易。