我在重新渲染视图的相关部分时遇到问题,而无需诉诸@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
或类似物)。
我错过了什么?
答案 0 :(得分:1)
<a4j:region>
仅用于执行。 string nameOfColorRed = Color.Red.Name;
不会生成任何HTML,因此您无法使用它进行渲染。