我有一个小的Vaadin应用程序,它有几个输入字段(组合框,选择组等...)。其中大部分内容由第一个ComboBox的所选内容决定。但是,当我选择其中的内容时,所有其他内容都保持空白,直到我点击一个,此时它们都会更新。这不是期望的行为,但我认为它是由服务器端是最新的但不更新客户端视图引起的。 (即使在我的第一个Combobox的ValueChangeListener中添加requestRepaint())
必须有一些方法强制Vaadin获取我希望它显示的数据,即使没有点击其他组件?
EDIT 我不允许这么快就回答我自己的问题,所以我暂时把它放在这里:
我发现有一种javascript方法可以同步客户端和服务器。
myComponent.getApplication().getMainWindow().executeJavaScript("javascript:vaadin.forceSync();");
我现在唯一的问题是,当我点击另一个组合框(或两次相同的组合框)时,我的一个组合框上的ValueChangeListener仍然只会触发。这是最奇怪的事情,因为第二个组合框在装载时会完美地发射它的事件。
答案 0 :(得分:18)
第一个ComboBox是否处于“立即”模式?
如果没有,它可能应该是:component.setImmediate(true)。
答案 1 :(得分:4)
如果您为组件设置了强制vaadin重新渲染它们的数据源,则可以使用hack。我用它来更新具有动态数据的表
yourcomponent.setContainerDataSource(yourcomponent.getContainerDataSource());
答案 2 :(得分:4)
我遇到了同样的问题,请参阅下面的版本8.0.5(2017年起):
@Push
public class WebUi extends UI {
public void fireComponentUpdated() {
getUI().push();
}
}
答案 3 :(得分:2)
您是否在正确的组件上请求了重写?
请记住,requestRepaint
将组件标记为脏,但并不意味着它将重新绘制 - 客户端只有在向服务器发出请求时才能刷新。
有关您的选项的更多信息,请参阅此主题https://vaadin.com/forum/-/message_boards/view_message/231271(它处理由于后台线程处理而导致的UI刷新)。
答案 4 :(得分:1)
在Vaadin 7 中将此行放在主UI.init(VaadinRequest)方法中就足够了:
UI.getCurrent().setPollInterval( 1000 );
如果你想每秒刷新你的UI(在这种情况下)。这样,您可以指示UI在定义的时间间隔内轮询服务器以进行更改。
请注意,如果您有大量用户同时使用您的应用程序,则过多的服务器流量可能会出现问题。
在Vaadin 6 中你必须使用ProgressIndicator(如果你愿意,它可能是隐形的)并尝试做类似于Vaadin 7中的UI.getCurrent()。setPollInterval(int)