Шов и JSF: как разместить несколько значений вместо одного - PullRequest
1 голос
/ 23 декабря 2010

У нас есть этот интерфейс: repeat:

<ui:repeat value="#{notAssigned}" var="pair">
   #{pair.data.processName}<br/>
   <s:button value="assign" action="#{mypage.assign}">
        <f:param name="taskId" value="#{pair.task.id}"/>
   </s:button>
</ui:repeat>

Теперь я могу назначать один и один элемент, но нажимая кнопку назначения.Но я хочу реорганизовать это и добавить флажок, чтобы вы могли выбрать все, что вы хотите назначить, а затем нажать одну кнопку, которая назначит все.

Как я могу изменить этот код для поддержки checkboxкоторый содержит taskId (который является длинным) и одну кнопку для отправки.

ОБНОВЛЕНИЕ

Я попытался изменить код для использования <h:selectManyCheckbox>

<h:selectManyCheckbox value="#{mypage.notAssignedTaskIds}">
    <f:selectItem itemValue="#{pair.task.id}" itemLabel="#{messages['choose']}" />
</h:selectManyCheckbox>
#{pair.data.processName}


<h:commandButton action="#{mypage.test}" value="Assign"/>

И в моем бобе:

@Setter @Getter
List<String> notAssignedTaskIds = new ArrayList<String>();

public void test() {
    log.info("Inside test, size of list #0", notAssignedTaskIds.size());
    for(String id : notAssignedTaskIds) {
        log.info("TaskId's chosen #0", id);
    }
}

Но notAssignedTaskids всегда пуст

Ответы [ 3 ]

1 голос
/ 23 декабря 2010

Мое предложение - создать логический флаг в паре объектов. Тогда

<a:region>

    <ui:repeat value="#{notAssigned}" var="pair">
        <h:selectBooleanCheckbox value="#{pair.booleanFlag}">

        #{pair.data.processName}
    </ui:repeat>

    <a:commandLink action="#{yourBean.assignAll()}" value="assignAll">
    </a:commandLink>

</a:region>

В вашем bean-компоненте переберите список notAssigned.

public void assignAll() {
.
.
.
    for (Pair pair : notAssigned) {
        if (pair.booleanFlag) {
            mypage.assign(pair);
        }
    }


}

И измените свой метод assign, чтобы получить объект пары. Кстати, вы можете сделать это без поддержки AJAX. Просто удали регион и преобразовать ваш a: commandLink в h: commandLink.

1 голос
/ 23 декабря 2010

Если вы не хотите изменять свою модель, добавьте Map<Long, Boolean> к вашему бобу.

private Map<Long, Boolean> selectedIds = new HashMap<Long, Boolean>();

Свяжите его со значением <h:selectBooleanCheckbox>, указав идентификатор задачи в качестве ключа.

<ui:repeat value="#{bean.notAssigned}" var="pair">
    <h:selectBooleanCheckbok value="#{bean.selectedIds[pair.task.id]}" />
    #{pair.data.processName}
</ui:repeat>
<s:button value="assign" action="#{bean.assign}" />

Собрать выбранные значения методом assign().

List<Pair> selectedPairs = new ArrayList<Pair>();
for (Pair pair : notAssigned) {
    if (selectedIds.get(pair.getTask().getId())) {
        selectedPairs.add(pair);
    }
}    
0 голосов
/ 23 декабря 2010

Я считаю, что вы хотите, чтобы ах: элемент selectManyCheckbox.Проверьте документы здесь .

...