有一个在运行时动态生成的列表。我正在使用dataTable来表示它。每行内部都有一个下拉列表。一旦用户从一行中的下拉列表中选择一个值,那么必须禁用所有其他行。?
<h:dataTable value="#{user.orderList}" var="item">
<h:column>
<h:selectOneMenu value="#{user.sometuff}" >
<f:selectItems value="#{user.someItems}" />
</h:selectOneMenu>
</h:column>
</h:dataTable>
如何使用<f:ajax>
实现此目的?
答案 0 :(得分:1)
这是一个有效的例子。
使用a4j:repeat和a4j:ajax标签,使用ajax4jsf(richfaces)可以更轻松地实现它。xhtml代码:
<h:form id="form">
<h:dataTable id="tableId" value="#{user.orderList}" var="item">
<h:column>
<h:selectOneMenu value="#{item.selectedItem}" disabled="#{user.oneItemSelected and (item.selectedItem == null || item.selectedItem == '')}">
<f:selectItems value="#{user.selectItemList}" />
<f:ajax execute="@this" render="@form" listener="#{user.updateSelectionFlag}"></f:ajax>
</h:selectOneMenu>
</h:column>
</h:dataTable>
</h:form>
订单商品代码:
public class Order implements Serializable
{
private static final long serialVersionUID = 1L;
private String selectedItem;
public String getSelectedItem() {
return selectedItem;
}
public void setSelectedItem(String selectedItem) {
this.selectedItem = selectedItem;
}
}
托管bean代码:
@Named
@ViewScoped
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private List<Order> orderList;
private List<SelectItem> selectItemList;
private boolean oneItemSelected;
public List<SelectItem> getSelectItemList() {
if (selectItemList == null)
{
selectItemList = new ArrayList<SelectItem>();
selectItemList.add(new SelectItem("", "---Please Choose---"));
selectItemList.add(new SelectItem("1", "Item 1"));
selectItemList.add(new SelectItem("2", "Item 2"));
selectItemList.add(new SelectItem("3", "Item 3"));
selectItemList.add(new SelectItem("4", "Item 4"));
}
return selectItemList;
}
public List<Order> getOrderList() {
if (orderList == null)
{
orderList = new ArrayList<Order>();
for (int i=0 ; i<4 ; i++)
{
orderList.add(new Order());
}
}
return orderList;
}
public boolean isOneItemSelected() {
return oneItemSelected;
}
public void updateSelectionFlag()
{
oneItemSelected = false;
for (int i=0 ; i<getOrderList().size() ; i++)
{
Order order = getOrderList().get(i);
if (order.getSelectedItem() != null && !order.getSelectedItem().equals(""))
{
oneItemSelected = true;
break;
}
}
}
}
顺便说一下,不是在updateSelectionFlag
中检查整个数组,而是最好只检查提交的项目的值。但我无法弄清楚如何获得点击的行索引h:dataTable
。执行绑定会阻止提交组合值,并且数据表不会提供varStatus
之类的ui:repeat
属性。