Как использовать <h:selectBooleanCheckbox> в <h:dataTable> или <ui:repeat> для выбора нескольких объектов?

У меня есть страница Facelets с a <h:dataTable>. В каждой строке существует a <h:selectBooleanCheckbox>. Если флажок устанавливается, объект позади соответствующей строки должен быть установлен в бобе.

  1. Как я делаю это?
  2. Как получить выбранные строки или их данные в отступающем бобе?
  3. Или было бы лучше сделать это с <h:selectManyCheckbox>?
20
задан BalusC 8 February 2018 в 12:46
поделиться

1 ответ

Лучше всего связать значение h: selectBooleanCheckbox со свойством Map где RowId представляет тип идентификатора строки. Возьмем, к примеру, объект Item , свойство идентификатора id - это Long :

<h:dataTable value="#{bean.items}" var="item">
    <h:column>
        <h:selectBooleanCheckbox value="#{bean.checked[item.id]}" />
    </h:column>
    ...
</h:dataTable>
<h:commandButton value="submit" action="#{bean.submit}" />

, которое должно использоваться в сочетании с:

public class Item {
    private Long id;
    // ...
}

и

public class Bean {
    private Map<Long, Boolean> checked = new HashMap<Long, Boolean>();
    private List<Item> items;

    public void submit() {
        List<Item> checkedItems = checked.entrySet().stream()
            .filter(Entry::getKey)
            .map(Entry::getValue)
            .collect(Collectors.toList());

        checked.clear(); // If necessary.

        // Now do your thing with checkedItems.
    }

    // ...
}

Видите ли, карта автоматически заполняется идентификатором всех элементов таблицы в качестве ключа, а значение флажка автоматически устанавливается как значение карты, связанное с идентификатором элемента как ключ.

52
ответ дан 29 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: