h:panelGrid
управляет макетом только своих собственных дочерних элементов (но не дочерних элементов его дочерних элементов) - каждый
<foo:exampleTag />
создает один составной элемент управления (со своими дочерними элементами)
Если вы хотите добавить несколько элементов управления в h:panelGrid
, используйте один из других шаблонных механизмов.
Например, этот h:panelGrid
использует ui:include
:
<h:panelGrid columns="2">
<ui:include src="gridme.xhtml">
<ui:param name="foo" value="Hello,"/>
<ui:param name="bar" value="World!"/>
</ui:include>
<ui:include src="gridme.xhtml">
<ui:param name="foo" value="Hello,"/>
<ui:param name="bar" value="Nurse!"/>
</ui:include>
</h:panelGrid>
Включенный состав файл:
<!-- gridme.xhtml -->
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html">
<h:outputText value="#{foo}" />
<h:outputText value="#{bar}" />
</ui:composition>
Подмножество вывода вида:
<table>
<tbody>
<tr>
<td>Hello,</td>
<td>World!</td>
</tr>
<tr>
<td>Hello,</td>
<td>Nurse!</td>
</tr>
</tbody>
</table>
TakeОсторожно с приведенной выше реализацией - вы не можете явно установить идентификаторы для чего-либо в gridme.xhtml
, поскольку нет составного элемента управления и, следовательно, нет NamespaceContainer
, чтобы гарантировать уникальное пространство имен для дочерних элементов.
Компонентне является тегом.
public void encodeBegin(FacesContext context) throws IOException {
getChildren().add(new HtmlLabel());
getChildren().add(new HtmlOutputText();
}
Это , а не приемлемый способ создания составного элемента управления.Если вы сделаете это, новые элементы управления будут добавлены к компоненту каждый раз, когда он отображается.Вы также не должны делать это в конструкторе;это тоже приведет к проблемам.Нет хорошего способа добавить дочерние элементы управления в элемент управления;это должно быть сделано извне (см. выше) или тегом .