我有一个<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。
我怎样才能让它工作?有没有更好的方法来解决这个问题?