【问题标题】:How to disable rest of the rows in a dynamic <h:dataTable> when one of the rows is selected?选择其中一行时,如何禁用动态 <h:dataTable> 中的其余行?
【发布时间】:2015-05-27 02:22:34
【问题描述】:

有一个在运行时动态生成的列表。我正在使用数据表来表示它。每行内都有一个下拉列表。一旦用户从一行中的下拉列表中选择了一个值,则必须禁用所有其他行。?

<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>

如何使用&lt;f:ajax&gt; 实现这一目标?

【问题讨论】:

  • 您要禁用整行(就行选择而言),还是只禁用其中的 selectOneMenu?
  • 因为只有一列,所以 selectOneMenu...

标签: ajax jsf-2 datatable


【解决方案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 的点击行索引。进行绑定会阻止组合值被提交,并且 datatable 没有像 ui:repeat 那样提供 varStatus 属性。

【讨论】:

  • 赞成给我一个解决方案。我明天会检查这个。然后在理解后将其标记为已接受。并真诚地感谢你。再次感谢您。
猜你喜欢
  • 2020-03-05
  • 2011-03-18
  • 2018-02-21
  • 1970-01-01
  • 2011-11-08
  • 2020-12-24
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多