Jsf 如何使h:dataTable的选定h:selectOneRadio在回发时保持选中状态?

Jsf 如何使h:dataTable的选定h:selectOneRadio在回发时保持选中状态?,jsf,datatable,jsf-2.2,selectoneradio,Jsf,Datatable,Jsf 2.2,Selectoneradio,在这种正常情况下: <h:form> <h:selectOneRadio value="#{bean.gender}"> <f:selectItem itemValue="Male" itemLabel="Male" /> <f:selectItem itemValue="Female" itemLabel="Female" /> <f:selectItem i

在这种正常情况下:

  <h:form>           
    <h:selectOneRadio value="#{bean.gender}">
        <f:selectItem itemValue="Male" itemLabel="Male" />
        <f:selectItem itemValue="Female" itemLabel="Female" />
        <f:selectItem itemValue="Other" itemLabel="Other" />
    </h:selectOneRadio>
    <h:commandButton value="Submit" action="#{bean.action}" />
  </h:form>

这个技巧是JSF 1.x/2.0/2.1的一个遗留问题,当时无法在
中使用
进行单行选择。这个把戏起源于我10年前的博客文章

根本问题是,HTML单选按钮是根据其
名称
属性分组的,因此webbrowser知道在选择一个按钮时要取消选择哪些其他按钮。但是JSF通过设计为每个
项生成一个不同的索引,行索引是内联的,因此它们不能分组,因此是基于JavaScript的解决方法

由于JSF2.2有了新的特性,因此可以强制将
name
属性设置为您选择的值,并通过助手
捕获所选项目。这在我去年的另一篇博客文章中得到了充实:。本文以
为例,可以将其改写为
,如下所示

<h:form>
    <h:dataTable value="#{bean.items}" var="item">
        <h:column>
            <input type="radio" jsf:id="item" a:name="#{hiddenItem.clientId}"
                value="#{item.id}" a:checked="#{item.id eq bean.selectedItemId ? 'checked' : null}" />
        </h:column>
        <h:column>#{item.id}</h:column>
        <h:column>#{item.name}</h:column>
    </h:dataTable>
    <h:inputHidden id="selectedItem" binding="#{hiddenItem}" value="#{bean.selectedItemId}"
        rendered="#{facesContext.currentPhaseId.ordinal ne 6}" />
    <h:commandButton id="submit" value="Submit" action="#{bean.submit}" />
</h:form>

#{item.id}
#{item.name}

@Named
@视域
公共类Bean实现了可序列化{
私人清单项目;
私有长选择的EMID;
// ...
公开作废提交(){
System.out.println(“所选项目ID:+selectedItemId”);
}
// ...
}
是的,选择的单选按钮以这种方式在回发时保持选中状态。您还可以传递整个实体,这只需要
上的转换器

            function deselectRadios(id) {

                var f = document.getElementById("hashMapFormId");
                for (var i = 0; i < f.length; i++)
                {
                    var e = f.elements[i];
                    var eid = e.id;
                    if (eid.indexOf("radiosId") !== -1) {
                        if (eid.indexOf(id) === -1) {
                            e.checked = false;
                        } else {
                            e.checked = true;
                        }
                    }
                }
            }
<f:selectItem itemValue="null"/>
<h:form>
    <h:dataTable value="#{bean.items}" var="item">
        <h:column>
            <input type="radio" jsf:id="item" a:name="#{hiddenItem.clientId}"
                value="#{item.id}" a:checked="#{item.id eq bean.selectedItemId ? 'checked' : null}" />
        </h:column>
        <h:column>#{item.id}</h:column>
        <h:column>#{item.name}</h:column>
    </h:dataTable>
    <h:inputHidden id="selectedItem" binding="#{hiddenItem}" value="#{bean.selectedItemId}"
        rendered="#{facesContext.currentPhaseId.ordinal ne 6}" />
    <h:commandButton id="submit" value="Submit" action="#{bean.submit}" />
</h:form>
@Named
@ViewScoped
public class Bean implements Serializable {

    private List<Item> items;
    private Long selectedItemId;

    // ...

    public void submit() {
        System.out.println("Selected item ID: " + selectedItemId);
    }

    // ...
}