当选择其中一行时,如何禁用动态<h:datatable>中的其余行?</h:datatable>

时间:2015-03-23 22:07:26

标签: ajax jsf-2 datatable

有一个在运行时动态生成的列表。我正在使用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>实现此目的?

1 个答案:

答案 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属性。