1

我有一个<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>

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

这是我遇到的问题:当我单击这些按钮之一时,AJAX 请求通过,并且支持对象确实发生了变化。但是,该列表不会更新。但是,当我第二次单击其中一个按钮时,先前的更改会反映在列表框中。

因此,如果我“下移”一项,则看不到任何变化。但是,如果我“向上移动”另一个项目,则该项目不会发生任何事情,但我之前想要向下移动的项目会向下移动。

通过强制另一个 AJAX 请求“有效”来破解这一点,除了第二个请求会清除任何应该显示的 FacesMessages。

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

4

2 回答 2

2

您不使用 有什么特别的原因rich:orderingList吗?订购列表正是它的目的。

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

于 2011-03-08T23:25:13.247 回答
1

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

于 2011-03-09T19:11:47.127 回答