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()。で子の FQN (またはそれで十分な場合は単純な名前) をチェックすることで、一種のinstanceofチェックを行うことができ<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 に答える