【发布时间】:2014-04-28 16:19:53
【问题描述】:
Vaadin 提供了一个导航器来在页面之间导航,但我不喜欢它编写 url 的方式,例如/VaadinApp/#!login。如何将该 URI 更改为 /VaadinApp/login。有人试过吗?
【问题讨论】:
Vaadin 提供了一个导航器来在页面之间导航,但我不喜欢它编写 url 的方式,例如/VaadinApp/#!login。如何将该 URI 更改为 /VaadinApp/login。有人试过吗?
【问题讨论】:
您需要扩展 UriFragmentManager 并覆盖 getState() 和 setState() 方法:
public void setState(String state) {
setFragment(state);
}
public String getState() {
return getFragment() != null ? getFragment() : "";
}
【讨论】:
UriFragementManager?使用导航器的主类已经扩展了UI。
在编写自定义 UriFragmentManager 之前请稍等。您确定要使用像 /VaadinApp/login 这样的 URI 吗?如果您只想摆脱 URI 片段中的!,您可以按照 Alexey 的建议编写自定义 UriFragmentManager。但 Vaadin 使用 shebang #! 表示 URI 片段 (look here) 是有充分理由的。
如果您真的不想使用井号,请三思。这基本上意味着完全没有 URI 片段,这不是您想要使用像 Vaadin 这样的单页应用程序框架走的路。 Vaadin 应用程序在单个页面上运行,任何用户操作和导航都通过轻量级 Ajax 请求处理。如果您使用/VaadinApp/login、/VaadinApp/profile、/VaadinApp/main 等 URL 结构,您的 Vaadin 应用程序最终会在用户执行每个导航步骤后进行完全重新加载。这将导致不可接受的闪烁效果,因为重新加载 Vaadin 应用程序将意味着浏览器通过相对较慢的 JavaScript 引擎完全重新呈现页面内容。确保您重新阅读有关Navigator component in the Book of Vaadin 的部分。此外,即使不推荐,使用自定义UriFragmentManager 也无法实现此解决方案。
也就是说,如果你想实现 Alexey 的解决方案,你可以使用上面显示的两个方法 getState() 和 setState() 编写一个 com.vaadin.navigator.Navigator.UriFragmentManager 的子类(与原始实现相比,这个提议的实现只是放弃了感叹号)。然后将此自定义片段管理器的实例传递给以下 Navigator 的构造函数之一:
Navigator(UI ui, NavigationStateManager stateManager,
ViewDisplay display)
UriFragmentManager 实现了NavigationStateManager 接口。
【讨论】: