我的复合组件(cc)创建一个inputText-Field。重要的是,它根据模型属性“可见”进行渲染。该模型通过参数“name”给予组件。
<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>
如果“visible”-property返回“false”,结果(和问题)如下:
没有任何组件被渲染(完美!)但是cc结果HTML留下了一个空单元格(例如<td></td>
),这导致了一个丑陋的HTML-Table(偏移一个单元格):
<table>
<tbody>
<tr>
<td></td>
<td>Next Label</td>
</tr>
....
据我所知,这与生命周期(jstl vs. jsf)有关:我的cc在<h:outputText../>
之前呈现,但我怎样才能摆脱空单元格(例如<td></td>
) ?我在这里错过了什么吗?
Thanx为您提供帮助,专家! 马克
答案 0 :(得分:2)
这是完全可以预料到的。复合组件 呈现。只有它的孩子不是。您需要将rendered
属性移动到复合组件。
<sbic:pmsInputText name="#{person.name}" rendered="#{person.name.visible}" />