基本上,我在面板网格中一次又一次地使用这种模式:
<h:panelGrid columns="2" >
<h:outputLabel for="heroName" value="Hero Name : " />
<h:panelGroup>
<h:inputText label="Hero Name : "
value="#{ccBean.data.map['heroName']}" id="heroName" />
<p:message for="heroName" />
</h:panelGroup>
...
</h:panelGrid>
我注意到我重复了很多东西,比如h:inputText中的id,它将在中为="idValue"为outputLabel再次重复,然后在p:message中再次重复。inputText的label值和h:outputLabel的值也会发生同样的情况。
所以,我想做一个简单的复合组件来包装这些:
<composite:interface>
<composite:attribute name="id" required="true" />
<composite:attribute name="label" required="true" />
<composite:attribute name="value" required="true" />
<composite:attribute name="includeLabel" required="false" default="false"/>
</composite:interface>
<composite:implementation>
<h:outputLabel for="#{cc.attrs.id}" value="#{cc.attrs.label}"
render="#{cc.attrs.includeLabel}" />
<h:panelGroup>
<h:inputText label="#{cc.attrs.label}"
value="#{cc.attrs.value}" id="#{cc.attrs.id}" />
<p:message for="#{cc.attrs.id}" />
</h:panelGroup>
</composite:implementation>
然后我使用复合组件:
<h:panelGrid columns="2" >
<s:inputText
id="heroName"
label="Hero Name : "
value="#{ccBean.data.map['heroName']}"
includeLabel="true"
/>
<s:inputText
id="heroName2"
label="Hero Name 2 : "
value="#{ccBean.data.map['heroName2']}"
includeLabel="true"
/>
...
</h:panelGrid>
该复合组件工作正常,但panelGrid现在假设s:inputText是一个组件。在使用复合组件之前,一行中有两个组件,即outputLabel和panelGroup。
在这种情况下,是否可以提示复合组件"扩展"自己,使其在我的panelGrid中占据2列而不是1列?
谢谢!
没有,很遗憾没有。您最好的选择是创建一个简单的标记文件。
另请参阅:
- 如何制作JSF复合组件的网格