避免在嵌套复合组件儿童中命名容器 /区域



我在视图的相关部分而不必求助于@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,但它仍然只呈现在rerender上的单个孩子。

我搜索了网络,但找不到这样做的原因,包括Inclession是否会隐式创建名称空间或命名容器(将其视为区域?)?找不到这样的东西,但是如果是这样,我该如何避免这种情况?我想要整个包装器(仅此包装器,而不是@form@all之类的)在单击孩子时都可以恢复。

我缺少什么?

@region仅用于执行。<a4j:region>不会生成任何HTML,因此您不能将其用于渲染。

最新更新