我有一个<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。
我怎样才能让它发挥作用?有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
您是否有使用rich:orderingList
的特殊原因?订购列表正是它的目的。
如果你不能那样做,a4j:log
说什么?小组是否重新渲染?如果是,有什么数据?
答案 1 :(得分:1)
我最终在a4j:commandButtons上设置了immediate =“true”。这与在列表框的onchange事件上放置一个AJAX调用(以便服务器知道所选项目是什么)相结合,给了我所需的行为。它不漂亮,但它有效,我不能花更多的时间在它上面。