GWT - Как программно снять флажок CheckboxCell, когда проверяется другой CheckboxCell? - PullRequest
0 голосов
/ 30 мая 2018

Учитывая два CheckboxCell checkboxA и checkboxB , как я могу программно снять флажок checkBB, если checkboxA снят?Из того, что я пробовал, я могу установить значение checkboxB = false при checkboxA = false, но это изменение не отражается в пользовательском интерфейсе.

Моя таблица с флажками -

public void buildTable() {
    myDataProvider.addDataDisplay(myTable);

    // other columns

    Column<Note, Boolean> checkboxA = new Column<Note, Boolean>(new CheckboxCell()){

        @Override
        public Boolean getValue(Note object) {
            return object.isAChecked();
        }

    };

    checkboxA.setFieldUpdater(new FieldUpdater<Note, Boolean>() {

        @Override
        public void update(int index, Note object, Boolean value) {
            performCheckboxAOperation(object, value);
        }
    });

    Column<Note, Boolean> checkboxB = new Column<Note, Boolean>(new CheckboxCell()){

        @Override
        public Boolean getValue(Note object) {
            return object.isBChecked();
        }

    };

    checkboxB.setFieldUpdater(new FieldUpdater<Note, Boolean>() {

        @Override
        public void update(int index, Note object, Boolean value) {
            performCheckboxBOperation(object, value);
        }
    });

    myTable.addColumn(checkboxA, "BOX A");
    myTable.addColumn(checkboxB, "BOX B");
}

Метод для хранения значения флажка A в БД, а если checkboxA == false, также установить checkboxB = false в БД -

public void performCheckboxAOperation(Note note, Boolean bool) {
    this.presenter.performBoxOperation(note, bool, new AsyncCallback<CNote>() {

        @Override
        public void onFailure(Throwable caught) {
            // error logic
        }

        @Override
        public void onSuccess(CompanyNote result) {
            cleanupDataProvider.flush();

            if (result.isAChecked() == false) {
                if (result.isBChecked() == true) {
                    unsetB(result);
                }
            }
        }
    });
}

Это мой метод для сброса флажка B, который меняетсязначение в БД, но не в пользовательском интерфейсе -

private void unsetB(Note note) {
    this.presenter.performBoxOperation(note, false, new AsyncCallback<Note>() {

        @Override
        public void onFailure(Throwable caught) {
            // error logic
        }

        @Override
        public void onSuccess(Note result) {
            myDataProvider.flush();
            myTable.redraw();
        }
    });
}

Насколько я понимаю, ListDataProvider необходимо сбросить, чтобы изменения отразились в пользовательском интерфейсе.Это очень хорошо работает для всех других полей в таблице, но не работает с CheckboxCells.

Я уже пытался redraw() таблицы, как видно выше, но безуспешно.

Так что же мне делать, чтобы вызвать изменение пользовательского интерфейса в другой CheckboxCell при нажатии на одну CheckboxCell?

1 Ответ

0 голосов
/ 30 мая 2018

Я думаю, что вы забыли изменить значение объекта.

private void unsetB(final Note note) {
    this.presenter.performBoxOperation(note, false, new AsyncCallback<Note>() {
        // ...
        @Override
        public void onSuccess(Note result) {
            note.setB(false);  // set B value or copy `result` to `note`
                               // (`note` must be final)
            myDataProvider.flush();
            myTable.redraw();
        }
    });
}

Кроме того, в performCheckboxAOperation вы вызываете unsetB(result); - это должно быть unsetB(note);

Вам нужночтобы понять, что в onSuccess вы получаете копию Note.Объект result отсутствует в DataProvider, note есть.И вы должны изменить значение note.

...