Wicket:使用自定义内容动态填充单元格
Wicket: Dynamically fill cells with custom content
我使用 wicket ListViews 创建了一个 table 来创建列和行,代码如下所示:
ErhebungMatrixPanel.java
public ErhebungMatrixPanel(String id) {
super(id);
this.add(matrixForm);
matrixForm.add(new ListView<Zustaendigkeit>("columns", zustaendigkeiten){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<Zustaendigkeit> item) {
final int index = item.getIndex();
item.add(new Label("zustLabel", zustaendigkeiten.get(index).getName().toString()));
}
});
matrixForm.add(rows = new ListView<Erhebung>("rows", erhebungen){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<Erhebung> item) {
final IModel<Boolean> checked = Model.of(Boolean.FALSE);
final int index = item.getIndex();
item.add(new Label("erhebungLabel", erhebungen.get(index).getName()));
item.add(new AjaxCheckBox("check", checked) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
//TODO
}
});
}
});
}
在这个 table 中,我想将 AjaxCheckBox 放入每个单元格中,以创建类似 授权矩阵的东西 现在的问题是,因为列表的长度zustaendigkeiten 一段时间后很可能会变大,以至于我无法插入静态数量的复选框。现在只有 table 的一列被复选框覆盖。响应的 .html 文件如下所示:
<wicket:panel>
<form wicket:id="matrixForm">
<table class="matrix">
<thead>
<tr class="headers">
<th></th>
<span wicket:id="columns">
<th wicket:id="zustLabel"></th>
</span>
</tr>
</thead>
<tbody>
<tr wicket:id="rows">
<th wicket:id="erhebungLabel"></th>
<td><input wicket:id="check" type="checkbox" /></td>
</tr>
</tbody>
</table>
</form>
</wicket:panel>
像这样:
<tbody>
<tr wicket:id="rows">
<th wicket:id="erhebungLabel"></th>
<td><input wicket:id="check" type="checkbox" /></td>
<td><input wicket:id="check" type="checkbox" /></td>
<td><input wicket:id="check" type="checkbox" /></td>
</tr>
</tbody>
显然行不通,因为 1. 它应该是动态的,但我想 JS 可以提供帮助,2. Wicket 会抛出标记错误。
是否有任何类似 newCellItem 的方法可以像 DataTable 中那样使用?
您需要这样的东西吗?
HTML:
<form>
<table>
<tr>
<th></th>
<th wicket:id="headerList"><span wicket:id="name"></span></th>
</tr>
<tr wicket:id="rowList">
<td wicket:id="name"></td>
<td wicket:id="cellList">
<input type="checkbox" wicket:id="checkbox"/>
</td>
</tr>
</table>
</form>
Java:
add(new ListView<User>("headerList", new PropertyModel<>(this, "users")) {
@Override
protected void populateItem(ListItem<User> listItem) {
listItem.add(new Label("name", new PropertyModel(listItem.getModelObject(), "name")));
}
});
add(new ListView<String>("rowList", new PropertyModel<>(this, "roles")) {
@Override
protected void populateItem(ListItem<String> listItem) {
final String role = listItem.getModelObject();
listItem.add(new Label("name", role));
listItem.add(new ListView<User>("cellList", new PropertyModel<>(TestPage.this, "users")) {
@Override
protected void populateItem(ListItem<User> listItem) {
final User user = listItem.getModelObject();
listItem.add(new AjaxCheckBox("checkbox", new IModel<Boolean>() {
@Override
public Boolean getObject() {
return user.getRoles().contains(role);
}
@Override
public void setObject(Boolean aBoolean) {
if (aBoolean) {
user.getRoles().add(role);
} else {
user.getRoles().remove(role);
}
}
@Override
public void detach() {
}
}) {
@Override
protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) {
}
});
}
});
}
});
我使用 wicket ListViews 创建了一个 table 来创建列和行,代码如下所示:
ErhebungMatrixPanel.java
public ErhebungMatrixPanel(String id) {
super(id);
this.add(matrixForm);
matrixForm.add(new ListView<Zustaendigkeit>("columns", zustaendigkeiten){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<Zustaendigkeit> item) {
final int index = item.getIndex();
item.add(new Label("zustLabel", zustaendigkeiten.get(index).getName().toString()));
}
});
matrixForm.add(rows = new ListView<Erhebung>("rows", erhebungen){
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(ListItem<Erhebung> item) {
final IModel<Boolean> checked = Model.of(Boolean.FALSE);
final int index = item.getIndex();
item.add(new Label("erhebungLabel", erhebungen.get(index).getName()));
item.add(new AjaxCheckBox("check", checked) {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
//TODO
}
});
}
});
}
在这个 table 中,我想将 AjaxCheckBox 放入每个单元格中,以创建类似 授权矩阵的东西 现在的问题是,因为列表的长度zustaendigkeiten 一段时间后很可能会变大,以至于我无法插入静态数量的复选框。现在只有 table 的一列被复选框覆盖。响应的 .html 文件如下所示:
<wicket:panel>
<form wicket:id="matrixForm">
<table class="matrix">
<thead>
<tr class="headers">
<th></th>
<span wicket:id="columns">
<th wicket:id="zustLabel"></th>
</span>
</tr>
</thead>
<tbody>
<tr wicket:id="rows">
<th wicket:id="erhebungLabel"></th>
<td><input wicket:id="check" type="checkbox" /></td>
</tr>
</tbody>
</table>
</form>
</wicket:panel>
像这样:
<tbody>
<tr wicket:id="rows">
<th wicket:id="erhebungLabel"></th>
<td><input wicket:id="check" type="checkbox" /></td>
<td><input wicket:id="check" type="checkbox" /></td>
<td><input wicket:id="check" type="checkbox" /></td>
</tr>
</tbody>
显然行不通,因为 1. 它应该是动态的,但我想 JS 可以提供帮助,2. Wicket 会抛出标记错误。
是否有任何类似 newCellItem 的方法可以像 DataTable 中那样使用?
您需要这样的东西吗?
HTML:
<form>
<table>
<tr>
<th></th>
<th wicket:id="headerList"><span wicket:id="name"></span></th>
</tr>
<tr wicket:id="rowList">
<td wicket:id="name"></td>
<td wicket:id="cellList">
<input type="checkbox" wicket:id="checkbox"/>
</td>
</tr>
</table>
</form>
Java:
add(new ListView<User>("headerList", new PropertyModel<>(this, "users")) {
@Override
protected void populateItem(ListItem<User> listItem) {
listItem.add(new Label("name", new PropertyModel(listItem.getModelObject(), "name")));
}
});
add(new ListView<String>("rowList", new PropertyModel<>(this, "roles")) {
@Override
protected void populateItem(ListItem<String> listItem) {
final String role = listItem.getModelObject();
listItem.add(new Label("name", role));
listItem.add(new ListView<User>("cellList", new PropertyModel<>(TestPage.this, "users")) {
@Override
protected void populateItem(ListItem<User> listItem) {
final User user = listItem.getModelObject();
listItem.add(new AjaxCheckBox("checkbox", new IModel<Boolean>() {
@Override
public Boolean getObject() {
return user.getRoles().contains(role);
}
@Override
public void setObject(Boolean aBoolean) {
if (aBoolean) {
user.getRoles().add(role);
} else {
user.getRoles().remove(role);
}
}
@Override
public void detach() {
}
}) {
@Override
protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) {
}
});
}
});
}
});