具有自定义日期表的Wicket AjaxCheckBox

时间:2019-01-08 14:18:30

标签: wicket

我正在使用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>

1 个答案:

答案 0 :(得分:1)

所有复选框均具有相同的标记ID。 这混淆了负责收集Ajax提交值的JavaScript。它使用document.getElementById('theId').value,并且始终指向具有该ID的页面中的第一个元素。

您需要删除field.setMarkupId(id);或对所有复选框使用唯一的ID。