我正在尝试创建一个包含在Primefaces Accordion控件中的嵌套JSF复合控件。但是,当选项卡组件放置在嵌套组件中时,它们根本不会呈现。
outerComponent.xhtml
<composite:interface/>
<composite:implementation>
<p:accordionPanel>
<composite:insertChildren/>
</p:accordionPanel>
</composite:implementation>
innerComponent.xhtml
<composite:interface>
<composite:attribute name="title" type="java.lang.String"/>
</composite:interface>
<composite:implementation>
<p:tab id="#{cc.attrs.title}" title="#{cc.attrs.title}">
Some content
</p:tab>
</composite:implementation>
testPage.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:w="http://java.sun.com/jsf/composite/wizard"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<w:outerComponent>
<w:innerComponent title="tab1"/>
</w:outerComponent>
</h:body>
</html>
HTML输出:
<html xmlns="http://www.w3.org/1999/xhtml"><head><link type="text/css"
rel="stylesheet" href="/iip/javax.faces.resource/theme.css.xhtml?ln=primefaces-
aristo-custom" /><link type="text/css" rel="stylesheet" href="/iip/
javax.faces.resource/primefaces.css.xhtml?ln=primefaces" /><script type="text/
javascript" src="/iip/javax.faces.resource/jquery/jquery.js.xhtml?
ln=primefaces"></script><script type="text/javascript" src="/iip/
javax.faces.resource/primefaces.js.xhtml?ln=primefaces"></script></head>
<body>
<div id="j_idt7:j_idt10" class="ui-accordion ui-widget ui-helper-reset ui-hidden-
container" role="tablist"><input type="hidden" id="j_idt7:j_idt10_active"
name="j_idt7:j_idt10_active" value="0" /></div>
<script id="j_idt7:j_idt10_s" type="text/
javascript">PrimeFaces.cw('AccordionPanel','widget_j_idt7_j_idt10',
{id:'j_idt7:j_idt10'});</script>
</body</html>
当它运行时没有错误,并且在渲染Accordion div时,选项卡不会。但是,如果我将<p:tab>
标记移动到outerComponent.xhtml
文件中,那么它们会正确呈现,但这不是我需要的。
有什么建议吗?
答案 0 :(得分:3)
迭代<p:dataTable>
,<p:tabView>
,<p:accordionPanel>
等组件不能将组合作为直接子项。他们应该拥有作为直接子女的完整<p:column>
或<p:tab>
成分。在视图渲染时进行迭代时,它们会循环遍历子项,并在渲染之前对它们进行instanceof UIColumn
或instanceof Tab
检查。如果失败(复合为NamingContainer
),那么它将被忽略。这是“按设计”。
最好的办法是使用标记文件而不是复合组件作为迭代组件的子项。
请注意,这对PrimeFaces来说并不明确。标准<h:dataTable>
有完全相同的问题。
答案 1 :(得分:0)
你是否试图在没有复合的情况下做到这一点 - 我的意思是将它们放在testPage.xhtml中。我没有尝试过这个特定的组合,但是我和tab和accordion一起遇到了其他组件的问题。检查问题是在复合材料中还是组件组合中。
似乎有些javascript彼此“不兼容”。
如果仍有问题,可以尝试封装选项卡。我尝试了不同的组合,似乎有些工作取决于导致问题的组件。我会首先在标签周围尝试<div id="tabContainer">
,如果不起作用,最终会转到p:panel
。