PassThroughAttribute для SubComponent внутри JSF Composite Component

Я знаю, что следующий пример работает. Атрибут id будет передан компоненту h:link и используется для построения URL (например, /model/{id}).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:cc="http://xmlns.jcp.org/jsf/composite"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
<cc:interface>
    <cc:attribute name="outcome" type="java.lang.String" />
    <cc:attribute name="href" type="java.lang.String" />
    <cc:attribute name="value" type="java.lang.String" />
    <cc:attribute name="icon" type="java.lang.String" />
</cc:interface>

<cc:implementation>
    <li class="#{prettyHelper.comparePrettyMappingIds(prettyContext.currentMapping.id, cc.attrs.outcome) ? 'active' : ''}">
        <h:link outcome="#{cc.attrs.outcome}" href="#{cc.attrs.href}" title="#{cc.attrs.value}">
            <f:passThroughAttribute name="data-tooltip" value="tooltip" />
            <f:passThroughAttribute name="data-placement" value="right" />

            <c:if test="${cc.attrs.icon != null}">
                <i class="#{cc.attrs.icon}"></i>
            </c:if>
            <c:if test="${cc.attrs.value != null}">
                <span><h:outputText value="#{cc.attrs.value}" /></span>
            </c:if>
            <cc:insertChildren />
        </h:link>
    </li>
</cc:implementation>
</html>

<...:link outcome="pretty:detail" icon="fa fa-pencil" value="Detail">
    <f:param name="id" value="#{bean.id}" />
</...:link>

Но этот пример не работает. Зачем?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:cc="http://xmlns.jcp.org/jsf/composite"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core">

<cc:interface>
    <cc:attribute name="id" type="java.lang.String" />
    <cc:attribute name="value" type="java.lang.String" />
    <cc:attribute name="style" type="java.lang.String" />
    <cc:attribute name="styleClass" default="form-control form-control-sm" type="java.lang.String" />
    <cc:attribute name="required" default="false" type="boolean" />
</cc:interface>

<cc:implementation>
    <h:inputText id="#{cc.attrs.id}" value="#{cc.attrs.value}"
        required="#{cc.attrs.required}"
        styleClass="#{cc.attrs.styleClass} #{ component.valid ? '' : 'is-invalid'}"
        style="#{cc.attrs.style}">
        <cc:insertChildren />
    </h:inputText>
</cc:implementation>
</html>

<...:simpleInput id="name" label="Name:"
    value="#{bean.name}">
    <f:passThroughAttribute name="autofocus" value="autofocus" />
    <f:passThroughAttribute name="placeholder"
        value="Name..." />
</...:simpleInput>

В первом примере атрибут f: param передается компоненту h:link. Во втором примере атрибуты f:passThroughAttribute не передаются в компонент h:inputText. Я создал обходной путь, передав карту атрибутов через simpleInput (f:passThroughAttributes). Мне кажется очень грязным настраивать карту атрибутов (внутри bean-компонента) и передавать их через компонент simpleInput.

public Map<String, Object> attributes() {
    return MapUtils.asMap(MapUtils.entry("placeholder", "Name..."));
}

<...:simpleInput id="name" label="Name:"
    value="#{bean.name}" passThroughAttribute="#{bean.attributes}">
</...:simpleInput>

нет другого решения?

0 ответов

Другие вопросы по тегам