避免在包含include的嵌套复合组件子项上命名容器/区域

时间:2016-12-08 11:06:51

标签: jsf richfaces

我在重新渲染视图的相关部分时遇到问题,而无需诉诸@form等。

我有一个像这样的复合组件:

wrapper.xhtml

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j">

    <cc:interface componentType="compositeComponent">
        <cc:attribute required="false" name="foo" />
    </cc:interface>

    <cc:implementation>
      <a4j:region>        
        <h:panelGroup id="content" layout="block" styleClass="my-wrapper">

            <h1>TITLE</h1>

            <c:forEach items="#{element.children}" var="element">
                <ui:include src="element.xhtml">
                   <ui:param name="level" value="0" />
                </ui:include>
            </c:forEach>

        </h:panelGroup>
      </a4j:region>      

    </cc:implementation>
</ui:composition>

element.xhtml

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j">

         <h:outputLabel styleClass="level-#{level}">
             #{element.label}
             <a4j:ajax event="click"
                listener="#{controller.updateElements(element)}"
                execute="@this" render="@region" />
        </h:outputLabel>        

        <c:if test="#{element.someTest}">
            <c:forEach items="#{element.children}" var="element">
                <ui:include src="element.xhtml">
                   <ui:param name="level" value="#{level + 1}" />
                </ui:include>
            </c:forEach>
        </c:if>

</ui:composition>

现在的问题是,虽然我在包装器周围设置<a4j:region>,并将子项中的渲染表达式设置为@region,但它仍然只渲染单个子项重新呈现。

我在网上搜索了SO但是找不到这个原因,include是否隐式创建命名空间或命名容器(将被视为区域?)?无法找到这样的东西,但如果是这样,我怎么能避免这种情况呢?我希望在点击一个孩子时重新呈现整个包装器(只有那个,而不是@form@all或类似物)。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

<a4j:region>仅用于执行。 string nameOfColorRed = Color.Red.Name; 不会生成任何HTML,因此您无法使用它进行渲染。