p: selectManyMenu (с флажком): добавить элемент и установить флажок одновременно - PullRequest
0 голосов
/ 25 февраля 2020

x html код

<p:selectManyMenu id="menuid"
                value="#{bean.selectedActivities}"
                showCheckbox="true" scrollable="true" scrollHeight="150">
                <f:selectItems value="#{bean.activities}" var="activity" itemValue="#{activity}"
                               itemLabel="#{activity}" />               
</p:selectManyMenu>
<p:commandButton value="ADD ACTIVITY" id="addId">
    <p:ajax event="click" process="@this" update="menuid" listener="#{bean.addActivity()}"/>
</p:commandButton>

Bean:

private List<String> selectedActivities = new ArrayList<>();
private List<String> activities = new ArrayList<>();
int index = 1;
public void addActivity(){
  String activity = "Activity "+ (index ++);
  activities.add(activity);
  selectedActivities.add(activity);
}

Этот код добавляет новый элемент в manyMenu, но флажок не установлен.

1 Ответ

3 голосов
/ 25 февраля 2020

Помимо некоторых пропущенных аннотаций я не вижу много неправильных. В любом случае, вот проверенное решение, основанное на вашем коде, которое должно работать. Сначала давайте определим вид. Это в основном то же самое, что и в вашем примере:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>SelectMany Example</title>
    </h:head>
    <h:body>
        <h:form>
            <p:selectManyMenu id="menuid"
                      value="#{selectManyBackingBean.selectedActivities}"
                      showCheckbox="true" scrollable="true" scrollHeight="150">
                <f:selectItems value="#{selectManyBackingBean.activities}" var="activity" itemValue="#{activity}"
                           itemLabel="#{activity}" />               
            </p:selectManyMenu>
            <p:commandButton value="ADD ACTIVITY" id="addId">
                <p:ajax event="click" process="@form" update="menuid"
                    listener="#{selectManyBackingBean.onAddActivity}"/>
            </p:commandButton>
        </h:form>
    </h:body>
</html>

Затем мы определяем базовый компонент:

@Data
@Named
@ViewScoped
public class SelectManyBackingBean implements Serializable {
    private List<String> selectedActivities;
    private List<String> activities;
    int index;

    @PostConstruct
    private void init() {
        activities =  new ArrayList<>();
        selectedActivities = new ArrayList<>();
        index = 0;
    }

    public void onAddActivity(){
        String activity = "Activity " + (index++);
        activities.add(activity);
        selectedActivities.add(activity);
    }
}

Это должно дать вам ожидаемое поведение. Нажав три раза на кнопку ADD ACTIVITY , вы получите следующий результат:

enter image description here

Обратите внимание на небольшое изменение в командной кнопке из process="@this" до process="@form". Это обеспечит включение всех изменений, внесенных вами в компонент, в отправку формы. Если вы сохраните его в исходном значении, любые нажатия на флажки в меню не будут сохраняться и будут сбрасывать записи в предыдущее значение при нажатии кнопки команды (это потому, что рассматриваемый компонент не включается при жизни цикл выполняется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...