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 {

}