Vaadin 7 和浏览器 url 更新
Vaadin 7 and browser url update
我的 Vaadin 7 应用程序对浏览器 url 更改没有反应。例如,我从键盘输入一个新的 url 参数并按下 Enter 键,之后什么都没有改变。
应用程序仅对 F5 或页面刷新按钮有反应。
如何让 Vaadin 7 应用程序在 url 更新后响应 Enter 键?
已更新
我正在使用 Vaadin com.vaadin.navigator.Navigator
对象。
例如我有一个url:http://example.com/#!products/30970
当我在浏览器地址栏中更改 url(例如更改为 http://example.com/#!products/34894)并按回车键时,我想在我的页面上更改信息以显示有关带有 id 的产品的信息34894 而不是之前 ID 为 30970 的产品。
Vaadin Navigator 和 UriFragmentChangedListener
现在我正在使用 Vaadin Navigator
来定义视图:
Navigator navigator = new Navigator(this, viewDisplay);
navigator.addView("products", ProductView.class);
第一次在网络浏览器中,我成功地使用产品 id
参数访问此视图,例如通过以下 url:
http://example.com/#!products/30970
ProductView
是第一次构建,在其 public void enter(ViewChangeListener.ViewChangeEvent event)
方法中我能够获取 uri 参数。
但在那之后,当我将此 url 中的网络浏览器地址栏中的产品 ID 更改为另一个(例如更改为 30971
以显示其他产品的信息)时:
http://example.com/#!products/30971
并按 Enter 键,视图不会刷新并且不会对这些更改做出反应..
根据评论中的建议,我添加了 UriFragmentChangedListener
侦听器,现在至少能够处理 URL 片段更改(按下 Enter 键后)。
现在,我的逻辑必须对这些更改做出反应,我正在寻找在 Vaadin 7 中实现它的正确方法。
所以,如果我理解正确 - 除了 Navigator 逻辑之外,我还必须使用这个侦听器,并且在这个侦听器逻辑内部,我必须获得对适当视图(navigator.getCurrentView()
?)对象的引用并调用此对象上的某些方法,以便在不重建完整视图的情况下更改内部视图状态?如果我是对的 - Vaadin 中是否有一些标准机制来简化这项工作?
查看 ProductView 的 ViewChangeEvent 中的参数
通过使用这个url结构“http://example.com/#!products/30970”,您可以读取产品id如下:
@Override
public void enter(ViewChangeEvent event) {
String productId = event.getParameters();
}
除了手动将 UriFragmentChangeEvent 传递给您的视图,我想不出其他方法。我猜 Vaadin API 不能自动完成。
public class MyUI extends UI{
@Override
protected void init(final VaadinRequest request) {
/*
* UriFragmentChangedListener
* when URL+Parameter manuell eingegeben werden
*/
getPage().addUriFragmentChangedListener(new UriFragmentChangedListener() {
@Override
public void uriFragmentChanged(UriFragmentChangedEvent event) {
View currentView = getNavigator().getCurrentView();
if(currentView != null){
if(currentView instanceof UriFragmentChangedListener){
((UriFragmentChangedListener)currentView).uriFragmentChanged(event); //custom method
}
}
}
});
}
}
要完成这项工作,请将 UriFragmentChangedListener 添加到您的 ProductView:
public class ProductView extends CustomComponent implements View, UriFragmentChangedListener {
}
我的 Vaadin 7 应用程序对浏览器 url 更改没有反应。例如,我从键盘输入一个新的 url 参数并按下 Enter 键,之后什么都没有改变。
应用程序仅对 F5 或页面刷新按钮有反应。
如何让 Vaadin 7 应用程序在 url 更新后响应 Enter 键?
已更新
我正在使用 Vaadin com.vaadin.navigator.Navigator
对象。
例如我有一个url:http://example.com/#!products/30970
当我在浏览器地址栏中更改 url(例如更改为 http://example.com/#!products/34894)并按回车键时,我想在我的页面上更改信息以显示有关带有 id 的产品的信息34894 而不是之前 ID 为 30970 的产品。
Vaadin Navigator 和 UriFragmentChangedListener
现在我正在使用 Vaadin Navigator
来定义视图:
Navigator navigator = new Navigator(this, viewDisplay);
navigator.addView("products", ProductView.class);
第一次在网络浏览器中,我成功地使用产品 id
参数访问此视图,例如通过以下 url:
http://example.com/#!products/30970
ProductView
是第一次构建,在其 public void enter(ViewChangeListener.ViewChangeEvent event)
方法中我能够获取 uri 参数。
但在那之后,当我将此 url 中的网络浏览器地址栏中的产品 ID 更改为另一个(例如更改为 30971
以显示其他产品的信息)时:
http://example.com/#!products/30971
并按 Enter 键,视图不会刷新并且不会对这些更改做出反应..
根据评论中的建议,我添加了 UriFragmentChangedListener
侦听器,现在至少能够处理 URL 片段更改(按下 Enter 键后)。
现在,我的逻辑必须对这些更改做出反应,我正在寻找在 Vaadin 7 中实现它的正确方法。
所以,如果我理解正确 - 除了 Navigator 逻辑之外,我还必须使用这个侦听器,并且在这个侦听器逻辑内部,我必须获得对适当视图(navigator.getCurrentView()
?)对象的引用并调用此对象上的某些方法,以便在不重建完整视图的情况下更改内部视图状态?如果我是对的 - Vaadin 中是否有一些标准机制来简化这项工作?
查看 ProductView 的 ViewChangeEvent 中的参数
通过使用这个url结构“http://example.com/#!products/30970”,您可以读取产品id如下:
@Override
public void enter(ViewChangeEvent event) {
String productId = event.getParameters();
}
除了手动将 UriFragmentChangeEvent 传递给您的视图,我想不出其他方法。我猜 Vaadin API 不能自动完成。
public class MyUI extends UI{
@Override
protected void init(final VaadinRequest request) {
/*
* UriFragmentChangedListener
* when URL+Parameter manuell eingegeben werden
*/
getPage().addUriFragmentChangedListener(new UriFragmentChangedListener() {
@Override
public void uriFragmentChanged(UriFragmentChangedEvent event) {
View currentView = getNavigator().getCurrentView();
if(currentView != null){
if(currentView instanceof UriFragmentChangedListener){
((UriFragmentChangedListener)currentView).uriFragmentChanged(event); //custom method
}
}
}
});
}
}
要完成这项工作,请将 UriFragmentChangedListener 添加到您的 ProductView:
public class ProductView extends CustomComponent implements View, UriFragmentChangedListener {
}