8

次の複合コンポーネントがあります。

<?xml version="1.0" encoding="UTF-8"?>
<ui:component xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:composite="http://java.sun.com/jsf/composite">

    <composite:interface>
        <composite:attribute required="true" name="field" />
        <composite:attribute required="true" name="value" />
        <composite:attribute required="false" name="size"/>
    </composite:interface>

    <composite:implementation>
    ...
            <div class="wrapper">
                <h:inputText value="#{cc.attrs.value}"
                    id="#{field.id}" 
                    rendered="#{field.rendered}" 
                    size="#{cc.attrs.size}">
                </h:inputText>
                <h:messages for="#{field.id}" styleClass="errorMessage"/>
            </div>
    ...
    </composite:implementation>
</ui:component>

size問題は、属性を設定せずにこのコンポーネントを使用している場合でもsize=0、html 入力要素のようにレンダリングされることです。

私が望むのは、ネストされたh:inputText's 属性に有効な値がある場合 (たとえば、空でない場合) にのみレンダリングすることです。または、明示的にオーバーライドされていない場合は、ネストされた要素のすべての属性を公開したいと思います。

それはどのように可能でしょうか?

4

3 に答える 3

13

JSTL<c:if>を使用して、条件付きでビューを作成し<f:attribute>、属性を個別に指定できます。

<h:inputText ...>
    <c:if test="#{not empty cc.attrs.size}">
        <f:attribute name="size" value="#{cc.attrs.size}" />
    </c:if>
</h:inputText>

別の方法は、複合コンポーネント属性のデフォルトを指定することです。

<cc:attribute name="size" required="false" default="10" />
于 2012-10-15T14:17:10.487 に答える
2

BalusC の投稿への追加:

使用する必要があります

cc:attribute-tag の type="int" :

cc:attribute name="maxlength" type="int"

于 2013-03-01T15:25:52.390 に答える
0

属性にアクセスする別の方法があると思います。Java予約キーワードで指定された属性にアクセスするときに、JSF 2でこれを使用しました。

{cc.attrs['size']}

于 2013-11-08T16:35:52.550 に答える