Пользовательский тег Facelets с несколькими дочерними компонентами в h: panelGrid - PullRequest
3 голосов
/ 09 мая 2011

Я написал собственный тег, расширяющий UIComponentBase.
Он добавляет несколько дочерних компонентов (UIComponent) во время метода encodeBegin.

В целях верстки я хотел бы вложить эти дочерние компоненты в h:panelGrid,
но тег мешает здесь.

ExampleTag.java

private ExampleTag extends UIComponentBase {

    public void encodeBegin(FacesContext context) throws IOException {
        getChildren().add(new HtmlLabel());
        getChildren().add(new HtmlOutputText();
    }
}

ExampleOutput.xhtml

<html>
    <h:panelGrid columns="2">
       <foo:exampleTag />
       <foo:exampleTag />
    </h:panelGrid>
</html>

Сгенерированный вывод будет содержать компоненты HtmlLabel и HtmlOutput в той же ячейке ,
но я бы хотел, чтобы они были в одном ряду, то есть две ячейки .

1 Ответ

3 голосов
/ 09 мая 2011
  1. h:panelGrid управляет макетом только своих собственных дочерних элементов (но не дочерних элементов его дочерних элементов)
  2. каждый <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();
}

Это , а не приемлемый способ создания составного элемента управления.Если вы сделаете это, новые элементы управления будут добавлены к компоненту каждый раз, когда он отображается.Вы также не должны делать это в конструкторе;это тоже приведет к проблемам.Нет хорошего способа добавить дочерние элементы управления в элемент управления;это должно быть сделано извне (см. выше) или тегом .

...