通过abstractajaxtimerbehavior控制wicket组件的可见性

neskvpey  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(260)

我用的是wicket 8.10。
我有一个wicket组件,我想根据一些外部条件动态隐藏或显示它。为此,我有以下代码:

var mccc = new MyCoolCustomComponent("component"); // Custom component I wrote
mccc.setOutputMarkupId(true);
mccc.setOutputMarkupPlaceholderTag(true);
mccc.setVisible(false); //Should be hidden initially

var container = new WebMarkupContainer("container");
container.setOutputMarkupId(true);
container.setOutputMarkupPlaceholderTag(true);
container.add(mccc);

add(container);

var updateTimer = new AbstractAjaxTimerBehavior(Duration.seconds(1)) {
  @Override
  protected void onTimer(AjaxRequestTarget target) {
    if(FooSingleton.instance().isBar()) {
      mccc.setVisible(true);
    } else {
      mccc.setVisible(false);
    }
    target.add(mccc);
  }
};
container.add(updateTimer);

相应的html如下所示:

<div wicket:id="container" >
    <div wicket:id="component"/>
</div>

我希望发生的是:组件最初是隐藏的。什么时候 isBar() 返回 true 组件将显示出来,一旦返回 false 它再次被隐藏。
实际发生的情况:组件最初是隐藏的。它只显示一次 isBar() 变成 true 但一次也看不见 isBar() 返回 false .
我还考虑过使用 AttributeModifier 使用css display 属性,但我找不到如何更改修改器的值。

o4hqfura

o4hqfura1#

我用css解决了这个问题:

mccc.add(new AttributeModifier("style",
  () -> {
    if (FooSingleton.instance().isBar()) {
      return "";
    }
    return "display: none;";
  }));

我相信这个解决方案不是很好,但它现在起作用了。

相关问题