我创建了facelet模板:
左right.xhtml
<ui:composition>
<ui:include name="left" />
<hr />
<ui:include name="right" />
</ui:composition>
之后,如果我将此模板用于 ui:decorate ,它可以正常工作:
的index.xhtml
<ui:decorate template="left-right.xhtml">
<ui:define name="left">FOO</ui:define>
<ui:define name="right">BAR</ui:define>
</ui:decorate>
但是,如果我将此模板用作自定义facelet标记,则它不起作用。
定制taglib.xml
<facelet-taglib>
<tag>
<tag-name>leftright</tag-name>
<source>left-right.xhtml</source>
</tag>
</facelet-taglib>
的index.xhtml
<custom:leftright>
<ui:define name="left">FOO</ui:define>
<ui:define name="right">BAR</ui:define>
</custom:leftright>
ui:define 标记内的内容未包含在模板中:(
因此,问题是如果将facelet模板呈现为facelet自定义标记,我该如何对其进行参数化?
答案 0 :(得分:4)
(请注意,left-right.xhtml
中存在语法错误,您应该使用<ui:insert>
代替<ui:include>
,但我认为它只是粗心过度简化)
标记文件不能视为模板客户端。您需要根据具体的功能要求对其进行不同的处理。如果您使用的是JSF 2.x,那么composite component将是您最需要的。您可以将部件定义为<f:facet>
,并在复合实现中按<cc:renderFacet>
进行渲染。
E.g。
/resources/custom/leftRight.xhtml
<cc:interface>
<cc:facet name="left" required="true" />
<cc:facet name="right" required="true" />
</cc:interface>
<cc:implementation>
<cc:renderFacet name="left" />
<hr />
<cc:renderFacet name="right" />
</cc:implementation>
用法:
<custom:leftRight>
<f:facet name="left">FOO</f:facet>
<f:facet name="right">FOO</f:facet>
</custom:leftRight>
但如果您仍然使用JSF 1.x,则无法创建复合组件。您需要坚持<ui:decorate>
。