Dan*_*ton 16 jsf facelets composition jsf-2
我有一个<ui:composition>包含一些带有显式id的元素和一些引用这些id进行部分处理/更新的ajax事件.我将xhtml的这个片段封装在组合中,这样我就可以在几个不同的地方使用它,而不必复制代码.但是,当我<ui:include>在页面中多次使用合成(with )时,我会得到重复的id异常.似乎JSF没有将每个组合包装在它自己的命名容器中(就像<ui:component>那样).
有没有一种简单的方法将我的作品包装在自己的命名容器中?或者,每次我想在公共命名容器中重用xhtml片段时,是否必须使用复合组件?
Bal*_*usC 31
根据<ui:include>模板的用途,您有以下几种选择:
使用<f:subview>.它创建另一个NamingContainer方面(如为<h:form>,<h:dataTable>和朋友都这样做):
<f:subview id="top">
<ui:include src="/WEB-INF/includes/some.xhtml" />
</f:subview>
...
<f:subview id="bottom">
<ui:include src="/WEB-INF/includes/some.xhtml" />
</f:subview>
Run Code Online (Sandbox Code Playgroud)
definied中的成分some.xhtml最终将分别获得top:并bottom:在他们的ID前缀.
把它变成一个TAGFILE需要的id属性.
<my:some id="top" />
...
<my:some id="bottom" />
Run Code Online (Sandbox Code Playgroud)
并使用该ID作为组合中组件的ID的前缀.
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
...
<h:someComponent id="#{id}_some" />
<h:otherComponent id="#{id}_other" />
...
<ui:composition>
Run Code Online (Sandbox Code Playgroud)
把它变成一个复合组件.复合组件本质上已经是a NamingContainer,因此它们的id属性是可选的.基本上,替换
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
...
<ui:composition>
Run Code Online (Sandbox Code Playgroud)
通过
<ui:component
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:cc="http://java.sun.com/jsf/composite"
>
<cc:interface>
<!-- This is optional. -->
</cc:interface>
<cc:implementation>
...
<h:someComponent id="some" />
<h:otherComponent id="other" />
...
</cc:implementation>
<ui:component>
Run Code Online (Sandbox Code Playgroud)
这样您可以按如下方式使用它:
<my:some id="top" />
...
<my:some id="bottom" />
Run Code Online (Sandbox Code Playgroud)
definied中的成分<cc:implementation>最终将分别获得top:并bottom:在他们的ID前缀(再次指出,复合材料组件的id属性是可选的,JSF将自动生成,否则一个).
当您包含多次相同时ui:composition,ID将被复制.解决方案是指定一个特定ui:param的内容ui:include.
假设你包含mycomposition.xhtml,你可以做类似的事情:
<ui:include src="mycomposition.xhtml">
<ui:param name="idPrefix" value="first"/>
</ui:include>
...
<ui:include src="mycomposition.xhtml">
<ui:param name="idPrefix" value="second"/>
</ui:include>
Run Code Online (Sandbox Code Playgroud)
然后在mycomposition.xhtml中你应该声明id如下(例如啊:outputText):
<h:outputText id="#{idPrefix}_text" value="My Awesome Text here"/>
Run Code Online (Sandbox Code Playgroud)
现在,您可以在其余页面中引用id作为#{idPrefix}_text.
| 归档时间: |
|
| 查看次数: |
7799 次 |
| 最近记录: |