JSF - h: selectOneListbox - как перемещать элементы вверх и вниз - PullRequest
1 голос
/ 09 марта 2011

У меня есть <h:selectOneListbox>, заполненный <s:selectItems>, который просто прикреплен к свойству списка в моем объекте Seam. Вот мой (упрощенный) код JSF:

<a4j:outputPanel ajaxRendered="true" id="valuesListPanel">
    <table border="0" cellspacing="5">
        <tr><td rowspan="5">
        <h:selectOneListbox id="pickValue" value="#{seamObject.selectedValue}">
            <s:selectItems value="#{seamObject.propertyValues}" var="properties" label="#{properties}" />
        </h:selectOneListbox>
        </td>
        <td><a4j:commandButton value="Move Up"
                  action="#{seamObject.moveUp}"/></td></tr>
        <tr><td><a4j:commandButton value="Move Down" action="#{seamObject.moveDown}"/></td></tr>
     </table>
 </a4j:outputPanel>

Методы moveUp и moveDown в объекте Seam находят выбранный элемент в списке поддержки и перемещают его вверх или вниз.

Вот проблема, с которой я сталкиваюсь: когда я нажимаю одну из этих кнопок, AJAX-запрос проходит, и объект поддержки действительно меняется. Тем не менее, список не обновляется. Однако во второй раз, когда я нажимаю одну из этих кнопок, предыдущее изменение отражается в списке.

Итак, если я «переместюсь» вниз на один пункт, никаких изменений не будет видно. Однако, если я «перемещаюсь» вверх по другому предмету, с этим ничего не случится, но предмет, который я раньше хотел сдвинуть, двигается вниз.

Взлом этого путем принудительного выполнения другого AJAX-запроса «работает», за исключением того, что второй запрос удаляет все сообщения FacesMessages, которые должны отображаться.

Как мне заставить это работать? Есть ли лучший способ подойти к проблеме?

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

Есть ли конкретная причина, по которой вы не используете rich:orderingList? Заказ списка - это именно то, для чего он предназначен.

Если вы не можете этого сделать, что говорит a4j:log? Панель перерисована? Если да, то с какими данными?

1 голос
/ 09 марта 2011

Я закончил тем, что установил немедленный = "true" на обе кнопки a4j: commandButtons. Это, в сочетании с вызовом AJAX для события onchange для списка (чтобы сервер знал, что это за выбранный элемент), дало мне желаемое поведение. Это не красиво, но работает, и я не могу позволить себе тратить на это гораздо больше времени.

...