我的Vaadin 7应用程序不会对浏览器url的更改做出反应。例如,我从键盘上输入一个新的url参数,然后按Enter键,之后什么都没有改变。
应用程序只对F5或页面刷新按钮作出反应。
如何使Vaadin 7应用程序在url更新后响应输入键?
更新
我正在使用Vaadin com.vaadin.navigator.Navigator对象。
例如,我有一个url:http://example.com/#!products/30970
当我更改浏览器地址栏中的url (例如,到http://example.com/#!products/34894)并按enter键时,我希望在我的页面上更改信息,以便用id 34894来显示有关产品的信息,而不是使用先前的id 30970的产品。
Vaadin Navigator和UriFragmentChangedListener
现在,我正在使用Vaadin Navigator来定义视图:
Navigator navigator = new Navigator(this, viewDisplay);
navigator.addView("products", ProductView.class);在web浏览器中,我第一次成功地使用产品id参数访问此视图,例如通过以下url:
http://example.com/#!products/30970ProductView是第一次构造的,在它的public void enter(ViewChangeListener.ViewChangeEvent event)方法中,我可以获得uri参数。
但在此之后,当我将此url中的web浏览器地址栏中的产品id更改为另一个(例如,为了显示另一个产品的信息而将其更改为30971 ):
http://example.com/#!products/30971然后按Enter键,视图就不会刷新,并且不会对这些更改做出反应。
正如注释中所建议的那样,我添加了UriFragmentChangedListener侦听器,并且现在至少能够处理URL片段的更改(在输入键提示之后)。
现在,我的逻辑必须对这些变化做出反应,我正在寻找一种正确的方法,在Vaadin 7.中实现它。
因此,如果我正确地理解了--除了Navigator逻辑之外,我还必须使用这个侦听器,而在这个侦听器逻辑中,我必须获得一个关于适当视图的引用(navigator.getCurrentView() ?)对象,并在此对象上调用某种方法来更改内部视图状态,而不重新生成完整视图?如果我是对的--为了简化这个工作,Vaadin有什么标准的机制吗?
发布于 2016-07-18 10:58:57
除了手动将UriFragmentChangeEvent传递给您的视图之外,我想不出其他的方法。我想Vaadin不能自动完成它。
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 {
}发布于 2016-07-18 10:10:24
查看ViewChangeEvent of您的ProductView中的参数
通过使用这个url结构"http://example.com/#!products/30970",您可以如下所示读取产品id:
@Override
public void enter(ViewChangeEvent event) {
String productId = event.getParameters();
}https://stackoverflow.com/questions/38423836
复制相似问题