在调用 modelChanged 方法时,在 Wicket 中使用 uniform() 会生成多个实例

Using uniform() in Wicket generates multiple instances when invoking the modelChanged method

我正在尝试实现一个简单的下拉菜单,该下拉菜单根据使用 Wicket 6.19 选择的另一个下拉菜单进行更新。到目前为止一切顺利,下拉列表正常工作。问题是我正在使用自定义的下拉选择组件,其中在 renderHead 方法中调用了 uniform() 方法。

@Override
public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    response.render(OnDomReadyHeaderItem.forScript("$('#" + getMarkupId(true) + "').uniform();"));
}

当我调用要更新的下拉列表的 modelChanged() 方法时,总是调用此方法(它是由其他人编写的)。因此,每次调用此 renderHead 方法时都会创建一个新的 div 元素,这会导致屏幕上的组件周围出现阴影。

Generated HTML after changing the selection of the dropdown several times

当我删除带有制服的代码时,不会生成额外的 div,但下拉菜单的样式有误。我不熟悉统一的方法。非常感谢您帮助解决此问题。

您可以用 if (!hasBeenRendered()) {...} 包装 renderHead() 中的代码。这样它只会在第一次 uniform

我知道自从我提出问题以来已经过去了很长一段时间,但最近我找到了解决方案。我知道这可能不是最好的解决方案,但它对我有用,也许它可以帮助遇到同样问题的人。

在此解决方案中,我在再次执行统一之前删除了 div 和子 span 元素。这样,调用统一方法后,我只有一个div。

@Override
public void renderHead(IHeaderResponse response) {
        super.renderHead(response);

        if(hasBeenRendered())
            response.render(OnDomReadyHeaderItem.forScript("$('#" + getMarkupId(true) + "').parent().replaceWith(function() {return $('select', this);});"));

        response.render(OnDomReadyHeaderItem.forScript("$('#" + getMarkupId(true) + "').uniform();"));      
}