3

我一直在寻找一种方法来制作类似于:<h:selectOneRadio /> 但我没有成功。

我想要类似的东西:

<myowntags:selectOneRadio>
  <f:selectItem itemValue="value0" itemLabel="This is the value 0" />
  <f:selectItem itemValue="value1" itemLabel="This is the value 1" />
  <f:selectItem itemValue="value2" itemLabel="This is the value 2" />
</myowntags:selectOneRadio>

和:

<myowntags:selectOneRadio>
  <f:selectItems  value="#{controller.items}"  />
</myowntags:selectOneRadio>

正如你所看到的,我希望这个复合组件有一个孩子:<f:selectItem />并按照我想要的方式渲染它。

提前致谢。

4

1 回答 1

3

您可以通过#{cc.children}. #{cc}指的是当前复合实例UIComponent,它又具有一个getChildren()方法。instanceof您可以通过在以下位置检查孩子的 FQN(或简单名称,如果足够的话)来进行某种检查<cc:implementation>

<c:forEach items="#{cc.children}" var="child">
    <c:set var="type" value="#{child['class'].simpleName}" />
    <c:if test="#{type == 'UISelectItem'}">
        <input type="radio" value="#{child.itemValue}" />#{child.itemLabel}<br/>
    </c:if>
    <c:if test="#{type == 'UISelectItems'}">
        <c:forEach items="#{child.value}" var="item">
            <input type="radio" value="#{item.value}" />#{item.label}<br/>
        </c:forEach>
    </c:if>
</c:forEach>

然而,您的下一个问题是收集提交的值。为此,您需要在您引用decode()的支持中实现该方法。或者,更好的是,使用a创建自定义。在视图中接管' 的工作很笨拙。UIComponent<cc:interface componentType>UIComponentRendererRenderer

于 2012-09-20T13:37:31.070 回答