首页 > 解决方案 > 向 Wicket 中的 dom 添加动态元素 ID

问题描述

我有一个重复的视图,里面有一个容器。另外,我在这个容器中添加了带有行为的元素。

RepeatingView listItems = new RepeatingView("listItems");
    listItems.setOutputMarkupId(true);
    listItems.setRenderBodyOnly(true);
    for (int i = 0; i < typeList.size(); i++) {
        WebMarkupContainer container = new WebMarkupContainer(listItems.newChildId());
        container.setOutputMarkupId(true);
        Label typeLabel = (Label) new Label("typeLabel" + i, "label");
        container.add(typeLabel);
        container.add(createMultiChoiceForCustomType("choice" + i, i));
        listItems.add(container);
    }
    add(listItems);

和 HTML

<div class="otherPermissionsOption">
      <div wicket:id="listItems"></div>
</div>

我在控制台中有一个错误

Wicket.Ajax:无法为元素“id13c”上的事件“change.select2”绑定侦听器,因为该元素不在 DOM 中

如何在 HTML 页面上放置动态容器+元素 ID 以消除此错误?是否可以在 Wicket 中使用动态容器?

标签: javawicket

解决方案


 listItems.setOutputMarkupId(true);
 listItems.setRenderBodyOnly(true);

这两行是矛盾的。

listItems.setOutputMarkupId(true);说 - 我希望 Wicket 为idHTML 元素添加属性并为其生成唯一值

listItems.setRenderBodyOnly(true);说 - 我不需要 HTML 元素标记(将其所有属性)。我希望 Wicket 只呈现该组件的子组件。您需要将其删除。

您的标记应包含子级的 HTML 元素:

<div class="otherPermissionsOption">
  <div wicket:id="listItems">
    <span wicket:id="typeLabel"></span>
    <div wicket:id="choice"></div>
  </div>
</div>

并且不需要+ i在 Java 代码中添加组件 id。

也不需要在以下位置进行投射:

... = (Label) new Label("typeLabel" + i, "label");

推荐阅读