Wicket:我可以在初始化 java 组件之前创建标记吗?

Wicket: Can I create the markup before initializing the java component?

html 文件如下所示:

<wicket:panel>
    <form wicket:id="adminUIForm">
        <table wicket:id="datatable" class="datatable"></table>
        <div wicket:id="institutTablePanel"></div>
    </form>
</wicket:panel>

但是在我的 Java 代码中,当单击数据表中的一行时,我只想实例化组件 institutTablePanel,因为构造函数如下所示:

target.add(new InstitutTablePanel("institutLabelPabel", selectedContact));

并且selectedContact不能为空。 是否有可能这样做而不会出现无法在我的 JavaCode 中找到组件的错误?

编辑: 这可能会有帮助

@Override
protected Item<Kontakt> newRowItem(final String id, final int index,
    final IModel<Kontakt> model) {
        Item<Kontakt> rowItem = new Item<Kontakt>(id, index, model);
        rowItem.add(new AjaxEventBehavior("onclick") {

        private static final long serialVersionUID = 1L;

        @Override
        protected void onEvent(AjaxRequestTarget target) {
             selectedKontakt = model.getObject();
             target.add(new InstitutTablePanel("institutTablePanel", selectedKontakt));
        }
    });
    return rowItem;
}

您必须在 ajax 调用中定位现有组件,因此我建议在使用模型作为面板模型的页面初始化时初始化 InstitutTablePanel。在 wicket 中不鼓励在没有包装模型的情况下传递模型对象,这会导致不必要的问题。

当模型对象为 null 或为空时,您可以将 InstitutTablePanel 更改为空。

此外,Wicket 是围绕将模型传递给组件而不是普通对象而构建的,乍一看这似乎是不必要的,但当复杂性增加时,该模式可以防止许多错误和错误。

编辑:不要忘记在添加的面板上使用 setoutputmarkupid(true)。

创建一个空白的 WebMarkupContainer div 并将其添加到您的 page/parent 组件中。接下来,onClick,使用 addOrReplace 并将 WebMarkupContainer 替换为 InstitutTablePanelWebMarkupContainerInstitutTablePanel 应该具有相同的 wicket:id