我正在尝试遵循Wicket manual中给出的示例。据我了解,根据手册,我的代码应生成带有单个复选框的HTML表单。没有。我在这里误会什么?
特别是,我在某种有点像波拉特语的英语中遇到了莫名其妙的异常:
org.apache.wicket.markup.MarkupException: Close tag not found for tag: <div wicket:id="formElement">. For Fragment Components only raw markup is allow in between the tags but not other Wicket Component.. Component: [Fragment [Component id = formElement]]
至少可以使用结束标签,不是吗?
HTML正文部分:
<body>
<p>Foo</p>
<form>
<div wicket:id="formElement">
<wicket:fragment wicket:id="chk">
<input type="checkbox">
</wicket:fragment>
</div>
<input type="submit">
</form>
</body>
Java部分:
public Home() {
RepeatingView rv = new RepeatingView("formElement");
Fragment chkbox = new Fragment("formElement", "chk", rv);
rv.add(chkbox);
this.add(rv);
}
答案 0 :(得分:1)
应该是:
<body>
<p>Foo</p>
<form>
<div wicket:id="formElement"></div>
<wicket:fragment wicket:id="chk">
<input type="checkbox">
</wicket:fragment>
<input type="submit" value="request">
</form>
</body>
和:
public Home() {
RepeatingView rv = new RepeatingView("formElement");
Fragment chkbox = new Fragment("formElement", "chk", this);
rv.add(chkbox);
this.add(rv);
}
不幸的是,“片段”无法重用,因为硬编码的wicket:id
都被用于查找 HTML标记块和用于添加它到目标容器。而且您不能添加两个具有相同ID的组件。
答案 1 :(得分:0)
Wicket Fragment是一个嵌入式面板。也就是说,您只需将其Java代码放入标记提供程序的Java文件中,并将其HTML放入标记提供程序的HTML代码中。
您所遇到的问题是您缺少一个HTML元素,该元素将占用Fragment生成的HTML。
我将与Panel进行解释,因为我认为它比较容易,但它们或多或少是相同的。使用Panel时,您需要声明类似<div wicket:id="myPanel">
的内容,然后在Java代码中声明类似的内容:
add(new MyPanel("myPanel", ...));
Wicket将呈现MyPanel并将生成的HTML用作<div wicket:id="myPanel">
的子代。
与Fragment相同-您需要:
<div wicket:id="someId">
<wicket:fragment>
(就像<wicket:panel>
一样)