Vaadin 7:UI与Navigator + Views的使用

cpo*_*rte 30 vaadin vaadin7

在Vaadin 7中,Web应用程序可以有多个入口点; 用户界面.每个UI只能有一个包含View导航器.

我们正在开发一个需要多级导航的应用程序,对于某些屏幕,我们不知道我们是否应该有一个带有导航器的UI或带有共享菜单组件的多个UI.

UI和Navigator有哪些优点和不便之处?有关此选择的指导方针吗?

dze*_*zzz 15

我建议在导航器中使用一个UI,因为在我看来,这足以完成这项工作.许多UI的主要不便之处是在它们之间切换时重新加载.您还需要记住所需的一致性,例如.在每个UI中具有相同的标头.根据我的经验,你肯定会遇到更多的问题;-)

要使其清洁,你应该使用MVP模式.我使用与com.google.common.eventbus.EventBus类似的方法来处理事件.我将eventBus添加到我的视图中,在那里发布事件并在适当的演示者中处理它们,而不在视图中实现监听器,在我看来这更有问题.由于MVP已经保留了"演示者"和"观看",我将Vaadin视为"页面".

您可以创建页眉,页脚主菜单,然后创建内容容器(例如,一些布局)到导航器:

Navigator n = new Navigator(UI.getCurrent(), layout);
Run Code Online (Sandbox Code Playgroud)

为了管理导航,我创建了PagesEnum,在更改视图时,我发布了ChangePageEvent,它将PageEnum.SOME_PAGE作为参数.可选地,还有要显示的项目的id.所以在MainPresenter我有:

@Subscribe
public void changePage(ChangePageEvent event) {
    String url = event.getPageName();
    if (event.hasId()) {
        url += "/" + event.getEntityId();
    }
    navigator.navigateTo(url);
}
Run Code Online (Sandbox Code Playgroud)

然后有不同的可能性:

  • 在输入页面的方法(Vaadin视图)中,确保显示适当的子菜单.

  • 将它作为参数添加到ChangePageEvent并在changePage方法中处理它.

  • 在PageEnum中将其硬编码为新字段,例如.subMenu并为子菜单创建其他枚举,在changePage方法中对其进行处理.

子菜单可能位于您导航器所连接的容器之外,因此您可以创建SubMenuPresenter和SubMenuView来处理子菜单更改.


Jak*_*ako 14

你问题的主题让我在2013年过得很热.我研究,分析和测试了Vaadin 7 UI和Navigator的各个方面.

我看了很多关于这个主题的框架,维基和论文; 与Vaadin 7相关且无关.

就在不久前(2013年初),我对这个问题并不新鲜; 无论如何,这些是我能够复活的一些链接:

我们的要求与Vaadin MVP Lite的情况有些相似; 但我们需要对视图的构成有更多的抽象和灵活性.我努力使用提供的导航器,但它不容易定制.

Navigator是一个具体的类.UI只能有一个导航器.在Navigator构造函数中,您可以找到以下行:

this.ui.setNavigator(this);
Run Code Online (Sandbox Code Playgroud)

Navigator在大多数应用程序中都能很好地满足简单需求,并提供开箱即用的优秀功能,但它并不适用于扩展或自定义.要记住的另一个方面是,当使用Navigator更改视图时,您可以更改屏幕上的所有组件; 你不能改变一点点.

然后我发现这个指南让我走上了一条有趣的道路: 编写用户界面,第7章 - MSDN Microsoft

这篇文章真的很棒,很有启发性; 虽然它与Delphi或任何其他基于组件的框架的工作方式有许多共同点,但"区域"概念确实是一种祝福.其他章节也非常有趣(模块化应用程序开发和MVVP).

最后,我们采用了只有一个UI的Region概念.简而言之,它的工作原理如下:

  • 有一个GUI组件,能够托管其他组件; 它可以容纳其他组件的地方就像"洞".每个孔都已注册,它是一个绑定到String名称的Region(简单的hasmap)
  • 通过Region名称,可以在Region中"放置"另一个Vaadin组件,以使其可见.

当UI被引入时发生的是一个区域被注册(整个UI)作为"根"区域.然后,表示登录表单的组件托管在"根"区域中.如果成功登录尝试,则在"根"区域中托管另一个组件(删除登录组件); 这个组件也是一个主机:它注册另一个名为"main"的区域,并且还有一个左侧导航菜单.现在,如果想要显示组件(例如,欢迎页面),则可以检索"主"区域并将组件显示出来.

Vaadin Navigator实现书签和后退按钮支持.我很伤心,因为我们没有开发它,但它不是我们的应用程序的要求.恕我直言,Vaadin家伙做了一个艰难但很好的决定,保持Navigator简单; 国家管理不容易实施.未来让Navigator更具扩展性将是一件好事.无论如何,我认为当前的Navigator可以满足大多数平均需求.

我的回答比预见的要长; 我希望我的努力可以提供帮助.