2011-07-05 165 views
1

我的複合組件(cc)創建一個inputText字段。重要的部分是,它根據模型屬性「可見」呈現。該模型通過parm「name」賦予組件。JSF 2複合組件渲染問題

<cc:interface> 
    <cc:attribute name="name" required="true"/> 
</cc:interface> 
<cc:implementation componentType="ch.sbi.pt.components.PMSInputText"> 
     <h:inputText value="#{cc.attrs.name.value}" rendered="#{cc.attrs.name.visible}"/> 
</cc:implementation> 

在視圖中我有一個2格/行的panelGrid:第一行有一個標籤和我的cc,第二個並不重要。該標籤使用與我的cc相同的模型屬性進行渲染。

<h:panelGrid columns="2"> 
    <h:outputText value="Name" rendered="#{person.name.visible}"/> 
    <sbic:pmsInputText name="#{person.name}"/> 
    <h:outputText value="Next Label"/> 
    <sbic:pmsInputText name="#{something.name}"/> 
</h:panelGrid> 

結果(和問題)是下面的,如果「可見」 - 屬性返回「假」: 無組件都呈現(!完美的),但CC生成的HTML留下一個空單元格(如<td></td>),這導致難看layouted HTML表(偏移一個單元):

<table> 
<tbody> 
<tr> 
<td></td> 
<td>Next Label</td> 
</tr> 
.... 

據我瞭解這是與生命週期(JSTL與JSF)做的事:我的CC呈現前<h:outputText../>但我如何擺脫空單元格(例如<td></td>)?我在這裏錯過了什麼嗎?

謝謝你的幫助,專家! Marc

+0

你對「JSTL vs JSF」有什麼意思?這裏沒有任何JSTL的東西。你是不是混淆/誤解JSTL是什麼?閱讀:http://stackoverflow.com/tags/jstl/info – BalusC

+0

是的,我是。我的錯。謝謝。 – MarcG

回答

2

這是完全預期的。複合組件被渲染爲。只有它的孩子不是。您需要改爲將rendered屬性移動到複合組件。

<sbic:pmsInputText name="#{person.name}" rendered="#{person.name.visible}" /> 
+0

好的,我看到了問題。謝謝。我對該組件的意圖是「呈現」 - 和「只讀」 - 封裝以提高效率和增加可讀性(僅限於xhtml中的名稱屬性)。我被賦予了一個使用jsf製作小型webapp的原型的命令,並且我想用乾淨而簡單的代碼留下深刻的印象,以消除由於複雜性而對jsf的疑慮。 – MarcG

+0

您可能會發現複合組件wiki頁面中的示例更有用。將鼠標放在問題下方的[composite-component]標籤上並等待彈出窗口顯示,然後單擊其中的* info *鏈接:http://stackoverflow.com/tags/composite-component/info對於標籤/輸入/消息組,您寧願使用簡單的標籤文件。你可以在這個答案中找到一個例子:http://stackoverflow.com/questions/5713718/how-to-make-a-grid-of-jsf-composite-component/5716633#5716633 – BalusC

+0

再次感謝你,BalusC。我將使用建議的標籤文件。你救了我的一天,因爲我被困在這... – MarcG