【问题标题】:Vaadin 7 and browser url updateVaadin 7 和浏览器 url 更新
【发布时间】:2016-07-17 17:12:33
【问题描述】:

我的 Vaadin 7 应用程序对浏览器 URL 更改没有反应。例如,我从键盘输入一个新的 url 参数并按 Enter 键,之后没有任何变化。

应用程序仅对 F5 或页面刷新按钮作出反应。

如何让 Vaadin 7 应用程序在 url 更新后响应 Enter 键?

更新

我正在使用 Vaadin com.vaadin.navigator.Navigator 对象。

例如我有一个网址: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 参数成功访问此视图,例如通过以下网址:

http://example.com/#!products/30970

ProductView 是第一次构造的,在其public void enter(ViewChangeListener.ViewChangeEvent event) 方法中,我能够获取 uri 参数。

但在那之后,当我将此网址中的网络浏览器地址栏中的产品ID更改为另一个时(例如更改为30971以显示另一个产品的信息):

http://example.com/#!products/30971

然后按 Enter 键,视图不会刷新并且不会对这些更改做出反应..

按照 cmets 中的建议,我添加了 UriFragmentChangedListener 监听器,现在至少能够处理 URL 片段更改(按 Enter 键后)。

现在,我的逻辑必须对这些变化做出反应,我正在寻找一种正确的方式,应该如何在 Vaadin 7 中实现它。

所以,如果我理解正确 - 除了导航器逻辑之外,我还必须使用此侦听器,并且在此侦听器逻辑内部,我必须获取有关适当视图(navigator.getCurrentView()?)对象的引用并对此调用一些方法对象以更改内部视图状态而无需重建完整视图?如果我是正确的 - Vaadin 中是否有一些标准机制来简化这项工作?

【问题讨论】:

  • 您使用的是navigatorFragmentChangeListener 还是RequestHandler?请提供更多详细信息,并可能显示一些代码并解释您希望它的行为方式。
  • @Morfic 我已经用更详细的信息更新了我的问题
  • 您是否添加了一个监听 URL 变化的监听器?这可能也有帮助vaadin.com/docs/-/part/framework/advanced/advanced-urifu.html
  • @AndréSchild 谢谢,我已经添加了这个监听器,现在至少能够处理 URL 片段的变化。所以,如果我理解正确 - 在这个基于 URI 片段的侦听器内部,我需要获取对适当视图(navigator.getCurrentView() ?)对象的引用并在该对象上调用一些方法,以便在没有完整视图的情况下更改内部视图状态重建?如果我是正确的 - Vaadin 中是否有一些标准机制来简化这项工作?
  • @alexanoid 通常你要么使用导航器(但你必须告诉导航器每个 URL)或者你自己处理片段

标签: vaadin vaadin7


【解决方案1】:

除了手动将 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 {

}

【讨论】:

  • 谢谢,我去测试一下
【解决方案2】:

看看你的 ProductView 的 ViewChangeEvent 中的参数

通过使用这个url结构“http://example.com/#!products/30970”,你可以读取产品id如下:

@Override
public void enter(ViewChangeEvent event) {

    String productId = event.getParameters();
}

【讨论】:

  • 谢谢,但是当我在同一个视图中更改 URI 参数时,此方法不会调用。
  • 抱歉,在您的帖子中没有看到。
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多