我正在使用wicket 1.4版本,并且正在使用datatables和ajax复选框:
我可以在html上呈现复选框。当我单击checkox时,也调用了ajax onUpdate方法,但它没有为我提供所选复选框的正确值,即this.getModelValue()始终在选择表行的第一个值。
我在这里想念什么?
add(getMyDynamicTable("myTable", provider, 10));
protected CustomDataTable<MyClass> getMyDynamicTable(String tableId, Provider provider, int numRows) {
final List<IColumn<MyClass>> myCloumns = new ArrayList<>();
myCloumns.add(new AbstractColumn<MyClass>(new ResourceModel(
"isSelected")) {
@Override
public void populateItem(Item<ICellPopulator<MyClass>> item,
String componentId, IModel<MyClass> rowModel) {
final MyClass myclass = rowModel.getObject();
CheckBoxPanel checkBoxPanel = new CheckBoxPanel(componentId, new PropertyModel<Boolean>(myclass, "isSelectedForRefund"));
item.add(checkBoxPanel);
}
@Override
public boolean isSortable() {
return true;
}
@Override
public String getSortProperty(){
return "isSelected";
}
});
return new CustomDataTable<MyClass>(tableId, myCloumns, provider, numRows, true);
}
class CheckBoxPanel extends Panel{
private static final String ID_CHECK = "checkBox";
private AjaxCheckBox field;
private IModel model;
public IModel getModel() {
return model;
}
public void setModel(IModel modelObject) {
this.model = modelObject;
}
public CheckBoxPanel(String id, IModel<Boolean> model) {
super(id, model);
System.out.println("clicked here "+ model.toString());
setModel(model);
field = new AjaxCheckBox(ID_CHECK, model) {
@Override
protected void onUpdate(AjaxRequestTarget target) {
target.addComponent(field);
if(this.getModelValue().equals("true")) {
System.out.println("Selected");
}
else if(this.getModelValue().equals("false")) {
System.out.println("UnSelected");
}
}
};
field.setMarkupId(id);
field.add(new SimpleAttributeModifier (ID_CHECK, id));
field.setOutputMarkupId(true);
add(field);
}
public CheckBoxPanel(String id) {
this(id, new Model());
}
}
在我的html上,我使用了datatable标签
<table class="dataview" cellspacing="0" wicket:id="myTable">[table]</table>
答案 0 :(得分:1)
所有复选框均具有相同的标记ID。
这混淆了负责收集Ajax提交值的JavaScript。它使用document.getElementById('theId').value
,并且始终指向具有该ID的页面中的第一个元素。
您需要删除field.setMarkupId(id);
或对所有复选框使用唯一的ID。