如何使用jsf为表中的每一行获取单选按钮组功能

时间:2010-09-02 11:51:15

标签: jsf richfaces

如何使用h:selectOneRadio

中封装的rich:dataTable获取如下布局
row1   col1   col2   col3

row2   radio1 radio1 radio1

row3   radio2 radio2 radio2

2 个答案:

答案 0 :(得分:5)

你可以使用战斧<t:selectOneRadio>layout="spread",并在每个<t:radio>

中放置一个<rich:column>

答案 1 :(得分:3)

我认为有三种方法可以做到:

  1. 使用Tomahawk <t:selectOneRadio><t:radio>组件,如Bozho所述。这是最简单的解决方案。唯一的缺点是您必须在项目中集成另一个组件库(Tomahawk)。但是,此库与其他库兼容,例如RichfacesIcefaces

  2. 为此创建自己的组件。这比以前的解决方案更复杂,并且可能不是很有趣,因为Tomahawk库已经提供了这个组件......

  3. 使用“基本”<h:selectOneRadio/>组件,然后使用Javascript代码将无线电元素移动到所需位置。在我的项目中,我有一个弹出窗口,其中包含一个复选框列表,但我想在两列中显示所有这些复选框。不幸的是,<h:selectManyCheckbox>组件仅提供pageDirectionlineDirection布局。所以我决定使用pageDirection布局显示它们,然后操纵生成的HTML代码,使用Javascript将列表分成两部分。

  4. 所以这就是我在JSF代码上所做的:

    <h:selectManyCheckbox id="rolesSelection" value="#{myRolesBean.selectedRoles}" layout="pageDirection">
        <f:selectItems value="#{myRolesBean.RolesList}"/>
    </h:selectManyCheckbox>
    
    <script type="text/javascript">
        splitElementsIntoTwoColumns("myForm\\:rolesSelection");
    </script>
    

    和Javascript函数(使用jQuery捆绑在Richfaces库中的function splitElementsIntoTwoColumns(tableId) { var idx = 1; var row, next; while ((row = jQuery('#' + tableId + ' tr:nth-child(' + idx++ + ')')).length) { if ((next = jQuery('#' + tableId + ' tr:nth-child(' + idx + ')')).length) { row.append(next.find('td')); next.remove(); } } } ):

    <rich:datatable>

    (关于此代码的更多解释here

    在您的情况下,Javascript函数将更难写,因为您想要移动由{{1}}生成的表格中的单选按钮。