JSF - h:selectOneListbox - 如何上下移动项目

时间:2011-03-08 23:15:18

标签: jsf richfaces seam ajax4jsf

我有一个<h:selectOneListbox>填充了<s:selectItems>,它只是附加到我的Seam对象上的list属性。这是我的(简化的)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>

Seam对象中的moveUp和moveDown方法在后备列表中查找所选项目,然后向上或向下移动。

这就是我遇到的问题:当我单击其中一个按钮时,AJAX请求会通过,并且后备对象会发生变化。但是,列表不会更新。但是,第二次单击其中一个按钮时,上一个更改将反映在列表框中。

所以,如果我“向下移动”一个项目,则看不到任何变化。但是,如果我“向上移动”另一个项目,那个项目没有任何反应,但我之前想要向下移动的项目向下移动。

通过强制另一个AJAX请求“工作”来解决这个问题,但第二个请求会清除应该显示的任何FacesMessages。

我怎样才能让它发挥作用?有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

您是否有使用rich:orderingList的特殊原因?订购列表正是它的目的。

如果你不能那样做,a4j:log说什么?小组是否重新渲染?如果是,有什么数据?

答案 1 :(得分:1)

我最终在a4j:commandButtons上设置了immediate =“true”。这与在列表框的onchange事件上放置一个AJAX调用(以便服务器知道所选项目是什么)相结合,给了我所需的行为。它不漂亮,但它有效,我不能花更多的时间在它上面。