【问题标题】:How can I force Vaadin v8 to update the screen?如何强制 Vaadin v8 更新屏幕?
【发布时间】:2011-11-28 07:01:28
【问题描述】:

我有一个小型 Vaadin v8 应用程序,它有几个输入字段(组合框、选择组等...)。其中大部分的内容由第一个 ComboBox 的所选内容决定。但是,当我在其中选择某些内容时,其他所有内容都保持空白,直到我单击一个,此时它们都会更新。这不是理想的行为,但我认为它是由服务器端是最新的但没有更新客户端视图引起的。 (即使在我的第一个 Combobox 的 ValueChangeListener 中添加 requestRepaint())

一定有某种方法可以强制 Vaadin 获取我希望它显示的数据,即使没有点击其他组件?

编辑 我不能这么快就自己的问题发布答案,所以我暂时放在这里:

我发现有一个 javascript 方法可以同步客户端和服务器。

myComponent.getApplication().getMainWindow().executeJavaScript("javascript:vaadin.forceSync();");

我现在唯一的问题是我的一个组合框上的 ValueChangeListener 仍然只在我单击另一个组合框(或同一个组合框两次)时触发。这是最奇怪的事情,因为第二个组合框在加载时会完美地触发它的事件。

【问题讨论】:

    标签: java vaadin


    【解决方案1】:

    第一个 ComboBox 是否处于“立即”模式?

    如果不是,它可能应该是:component.setImmediate(true)。

    https://vaadin.com/book/-/page/components.selection.html

    【讨论】:

    • 修复了它,不敢相信我错过了,因为我已经正确设置了另一个。我将在我的帖子中留下我的答案并选择这个作为接受
    【解决方案2】:

    我遇到了同样的问题,请看下面如何在 8.0.5 版(从 2017 年开始)中完成:

    @Push
    public class WebUi extends UI {
       public void fireComponentUpdated() {
          getUI().push();
       }
    }
    

    【讨论】:

    • 如何启用服务器推送?
    • @Alex78191 要启用服务器推送,您必须将 @Push 添加到扩展 UI 的类中,有关详细信息,请参阅 official documentation(我知道这对 Alex 可能没有用,因为我回答了 2 年稍后,但对于任何坚持这一点的人)
    【解决方案3】:

    如果您为组件设置了数据源,可以强制 vaadin 重新渲染它们,则可以使用 hack。我用它来更新具有动态数据的表

    yourcomponent.setContainerDataSource(yourcomponent.getContainerDataSource());
    

    【讨论】:

    • Eww。 =) 我很惊讶开发团队还没有优化这个案例。
    【解决方案4】:

    您是否要求在正确的组件上重绘?

    请记住,requestRepaint 将组件标记为脏,但这并不意味着它将被重新绘制 - 客户端只有在向服务器发出请求时才能被刷新。

    请参阅此线程 https://vaadin.com/forum/-/message_boards/view_message/231271 了解有关您的选项的更多信息(它处理由于后台线程处理而导致的 UI 刷新)。

    【讨论】:

      【解决方案5】:

      在 Vaadin 7 中将这一行放在主 UI.init(VaadinRequest) 方法中就足够了:

      UI.getCurrent().setPollInterval( 1000 );
      

      如果您想每秒刷新一次 UI(在这种情况下)。这样,您可以指示 UI 在定义的时间间隔内轮询服务器以获取更改。

      请注意,如果您有很多用户同时使用您的应用程序,那么过多的服务器流量可能会成为问题。

      在 Vaadin 6 中,您将不得不使用 ProgressIndicator(如果您愿意,它可能是不可见的)并尝试执行与 Vaadin 7 中的 UI.getCurrent().setPollInterval(int) 类似的操作.

      【讨论】:

      • 不是一个好主意。为此,我建议启用服务器推送。虽然这似乎不是 OP 问题。
      • @Pere 如何启用服务器推送?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多