Калитка AjaxCheckBox с пользовательскими таблицами дат - PullRequest
0 голосов
/ 08 января 2019

Я использую версию калитки 1.4 и играю с флажками datatables и ajax:

Я могу сделать флажки в HTML. Когда я нажимаю на флажок, также вызывается метод 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 голосов
/ 08 января 2019

Все ваши флажки имеют одинаковый идентификатор разметки. Это сбивает с толку JavaScript, ответственный за сбор значения для отправки Ajax. Он использует document.getElementById('theId').value и всегда указывает на первый элемент на странице с таким идентификатором.

Вам необходимо удалить field.setMarkupId(id); или использовать уникальные идентификаторы для всех флажков.

...