Vaadin 7:UI与Navigator + Views的使用

时间:2013-11-26 10:41:28

标签: vaadin vaadin7

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

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

UI和Navigator有哪些优点和不便之处?关于这个选择有什么指导吗?

2 个答案:

答案 0 :(得分:15)

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

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

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

Navigator n = new Navigator(UI.getCurrent(), layout);

要管理导航,我创建了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);
}

然后有不同的可能性:

  • 在页面的输入方法(Vaadin视图)中,确保显示相应的子菜单。

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

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

子菜单可能位于您使用Navigator连接的容器之外,因此您可以创建SubMenuPresenter和SubMenuView来处理子菜单更改。

答案 1 :(得分:14)

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

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

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

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

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

this.ui.setNavigator(this);

导航器可以满足大多数应用程序的需求,并提供开箱即用的功能,但它并不适合扩展或自定义。 要记住的另一个方面是,在使用Navigator更改视图时,您可以更改屏幕上的所有组件;你无法改变一点点。

然后我发现这个指南让我走上了一条有趣的道路: Composing the User Interface, Chapter 7 - MSDN Microsoft

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

最后,我们采用了只有一个UI的Region概念。 简而言之就是这样:

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

当UI被引入时会发生一个区域被注册(整个UI)作为' root'区域。 然后,代表登录表单的组件托管在' root'区域。 如果成功登录尝试,则另一个组件托管在' root' region(删除登录组件);这个组件也是一个主机:它注册另一个名为' main'并有一个左侧导航菜单。 现在,如果想要显示一个组件(例如,欢迎页面),可以检索“主要”组件。区域并放置要显示的组件。

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

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