在 Wicket ListView 中使用链接作为 LIstItem
Use Links as LIstItem in Wicket ListView
我正在尝试将 link 定义为 Wicket ListView 的 ListItem,如下所示:
<div wicket:id="outer" class="list-group">
<a wicket:id="list_items" class="list-group-item">
<span wicket:id="name"></span>
</a>
</div>
每个项目周围不应有任何 div/span。预期输出为:
<div class="list-group">
<a class="list-group-item" href="./foo/bar1">
<span>bar1</span>
</a>
<a class="list-group-item" href="./foo/bar2">
<span>bar2</span>
</a>
<a class="list-group-item" href="./foo/bar3">
<span>bar3</span>
</a>
</div>
这可以通过手动设置 href
来实现:
@Override
protected void populateItem(final ListItem<Course> item)
{
String url=urlFor(FooPage.class,new PageParameters().add("name",item.getModelObject().getBar())).toString();
item.add(new AttributeModifier("href",url));
item.add(new Label("name", new PropertyModel(item.getModel(), "bar")));
}
一切都很好,我将继续使用此解决方案,但不知何故感觉不对。这是完成这项工作的最佳方式吗?
使用AttributeModifier修饰href-attribute确实感觉有点不对
如果您不希望在结果 HTML 中的每个列表元素周围有任何实际的 HTML 标签,您可以使用 <wicket:container>
标签。它不会呈现到最终页面中,除非您处于 运行 开发模式。
所以你的 HTML 可能看起来像这样
<div class="list-group">
<wicket:container wicket:id="outer">
<a wicket:id="link" class="list-group-item">
<span wicket:id="name"></span>
</a>
</wicket:container>
</div>
你的 Java 代码是这样的
add(new ListView<Course>("list-group", list) {
@Override
protected void populateItem(ListItem<Course> item) {
PageParameters parameters = new PageParameters().add("name", item.getModelObject().getBar());
BookmarkablePageLink<Object> link = new BookmarkablePageLink<>("link", FooPage.class, parameters);
item.add(link);
link.add(new Label("name", new PropertyModel(item.getModel(), "bar")));
}
});
或者不使用 <wicket:container>
标签,您也可以使用标准 <div>
标签并在 ListView#populateItem()
中设置 item.setRenderBodyOnly(true)
来隐藏它们,但我认为这有点不太优雅。
Tekki 的回答非常好,但这里还有一个技巧:
new RepeatingView("list_items") {
protected void onPopulate() {
removeAll();
for (Course course : list) {
PageParameters parameters = new PageParameters().add("name", course.getBar());
BookmarkablePageLink<Object> link = new BookmarkablePageLink<>(newChildId(), FooPage.class, parameters);
add(link);
link.add(new Label("name", course.getBar()));
}
}
}
所以基本上我们跳过中间项目组件的创建,直接使用链接作为转发器的子项。
我正在尝试将 link 定义为 Wicket ListView 的 ListItem,如下所示:
<div wicket:id="outer" class="list-group">
<a wicket:id="list_items" class="list-group-item">
<span wicket:id="name"></span>
</a>
</div>
每个项目周围不应有任何 div/span。预期输出为:
<div class="list-group">
<a class="list-group-item" href="./foo/bar1">
<span>bar1</span>
</a>
<a class="list-group-item" href="./foo/bar2">
<span>bar2</span>
</a>
<a class="list-group-item" href="./foo/bar3">
<span>bar3</span>
</a>
</div>
这可以通过手动设置 href
来实现:
@Override
protected void populateItem(final ListItem<Course> item)
{
String url=urlFor(FooPage.class,new PageParameters().add("name",item.getModelObject().getBar())).toString();
item.add(new AttributeModifier("href",url));
item.add(new Label("name", new PropertyModel(item.getModel(), "bar")));
}
一切都很好,我将继续使用此解决方案,但不知何故感觉不对。这是完成这项工作的最佳方式吗?
使用AttributeModifier修饰href-attribute确实感觉有点不对
如果您不希望在结果 HTML 中的每个列表元素周围有任何实际的 HTML 标签,您可以使用 <wicket:container>
标签。它不会呈现到最终页面中,除非您处于 运行 开发模式。
所以你的 HTML 可能看起来像这样
<div class="list-group">
<wicket:container wicket:id="outer">
<a wicket:id="link" class="list-group-item">
<span wicket:id="name"></span>
</a>
</wicket:container>
</div>
你的 Java 代码是这样的
add(new ListView<Course>("list-group", list) {
@Override
protected void populateItem(ListItem<Course> item) {
PageParameters parameters = new PageParameters().add("name", item.getModelObject().getBar());
BookmarkablePageLink<Object> link = new BookmarkablePageLink<>("link", FooPage.class, parameters);
item.add(link);
link.add(new Label("name", new PropertyModel(item.getModel(), "bar")));
}
});
或者不使用 <wicket:container>
标签,您也可以使用标准 <div>
标签并在 ListView#populateItem()
中设置 item.setRenderBodyOnly(true)
来隐藏它们,但我认为这有点不太优雅。
Tekki 的回答非常好,但这里还有一个技巧:
new RepeatingView("list_items") {
protected void onPopulate() {
removeAll();
for (Course course : list) {
PageParameters parameters = new PageParameters().add("name", course.getBar());
BookmarkablePageLink<Object> link = new BookmarkablePageLink<>(newChildId(), FooPage.class, parameters);
add(link);
link.add(new Label("name", course.getBar()));
}
}
}
所以基本上我们跳过中间项目组件的创建,直接使用链接作为转发器的子项。