我的Vaadin 7应用程序对浏览器URL更改没有反应。例如,我从键盘输入一个新的url参数,然后按Enter键,之后没有任何变化。
应用程序仅对F5或页面刷新按钮作出反应。
如何在更新网址后让Vaadin 7应用程序响应Enter键?
已更新
我正在使用Vaadin com.vaadin.navigator.Navigator
对象。
例如,我有一个网址:http://example.com/#!products/30970
当我更改浏览器地址栏中的网址时(例如更改为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
参数访问此视图,例如通过以下网址:
http://example.com/#!products/30970
ProductView
是第一次构建的,并且在其public void enter(ViewChangeListener.ViewChangeEvent event)
方法中,我能够获得uri参数。
但之后我将此网址中的网址浏览器地址栏中的产品ID更改为另一个(例如30971
以显示其他产品的信息):
http://example.com/#!products/30971
并按Enter键,视图不会刷新,也不会对这些更改做出反应。
正如评论中所建议的那样,我添加了UriFragmentChangedListener
监听器,现在至少能够处理URL片段更改(在输入密钥预设之后)。
现在,我的逻辑必须对这些变化做出反应,并且我正在寻找一种正确的方法,以便在Vaadin 7中实现它。
所以,如果我理解正确 - 除了Navigator逻辑之外我还必须使用这个监听器并且在这个监听器逻辑内部我必须得到适当的视图(navigator.getCurrentView()
?)对象的引用并调用一些方法在此对象上更改内部视图状态而不进行完整视图重建?如果我是正确的 - 为了简化这项工作,Vaadin中是否有一些标准机制?
答案 0 :(得分:2)
我想不出另一种方法,而不是手动将UriFragmentChangeEvent传递给View。我想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 {
}
答案 1 :(得分:0)
查看ProductView
的ViewChangeEvent中的参数通过使用此网址结构“http://example.com/#!products/30970”,您可以阅读产品ID,如下所示:
@Override
public void enter(ViewChangeEvent event) {
String productId = event.getParameters();
}