1

PrimefacesアコーディオンコントロールにラップされたネストされたJSFコンポジットコントロールを作成しようとしています。ただし、タブコンポーネントがネストされたコンポーネント内に配置されている場合、それらはまったくレンダリングされません。

externalComponent.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>

実行時にエラーは発生せず、アコーディオンdivがレンダリングされている間、タブはレンダリングされません。ただし、<p:tab>タグをouterComponent.xhtmlファイルに移動すると、正しくレンダリングされますが、それは私が必要とするものではありません。

助言がありますか?

4

2 に答える 2

3

、、、など<p:dataTable>の反復コンポーネントは、直接の子としてコンポジットを持つことはできません。彼らは直接の子供として十分な価値のあるまたはコンポーネントを持っている必要があります。ビューのレンダリング時間中に反復している間、子をループし、レンダリングする前に子を実行またはチェックします。失敗した場合(コンポジットは)、無視されます。これは「設計による」ものです。<p:tabView><p:accordionPanel><p:column><p:tab>instanceof UIColumninstanceof TabNamingContainer

最善の策は、反復コンポーネントの子として複合コンポーネントの代わりにタグファイルを使用することです。

これはPrimeFacesに固有のものではないことに注意してください。標準<h:dataTable>にもまったく同じ問題があります。

参照:

于 2012-12-14T11:41:17.930 に答える
0

コンポジットなしでこれを実行しようとしましたか?つまり、すべてをtestPage.xhtmlにまとめます。私はこの特定の組み合わせを試していませんが、他のコンポーネントと組み合わせたタブとアコーディオンの両方で問題が発生しました。問題がコンポジットにあるのか、コンポーネントの組み合わせにあるのかを確認します。

互いに「互換性がない」JavaScriptがいくつかあるようです。

それでも問題が解決しない場合は、タブをカプセル化してみてください。さまざまな組み合わせを試しましたが、問題の原因となっているコンポーネントによっては機能しているようです。私は最初にタブの周りを試してみて、それが機能しない場合は<div id="tabContainer">最終的にに行きます。p:panel

于 2012-12-14T09:20:03.430 に答える