используя insertChildren И получая дочерние атрибуты

На самом деле я пытаюсь создать собственный компонент составной таблицы, потому что h: datatable или p: datatable не соответствуют моим потребностям. Тем не менее, он должен использоваться как таблица данных простых лиц. После того, как я нашел дочерние составные компоненты JSF и Отображение элементов списка при повторении внутри составного компонента Я видел финишную черту, но теперь я получил застрявший.

Мой xhtml:

<h:body>
    <sm:datatable mode="columntoggle" id="mytable" value="#{managerBean.objects}" var="object">
        <sm:column header="KeyHeader" property="key">
            <h:outputText value="#{object.key}"/>    
        </sm:column>
        <sm:column header="ValueHeader" property="value">
            <h:outputText value="#{object.value}"/>    
        </sm:column>
    </sm:datatable>
</h:body>

А это композит с данными:

<cc:interface>
    <cc:attribute name="id" />
    <cc:attribute name="mode" />
    <cc:attribute name="var" />
    <cc:attribute name="value" type="java.util.List"/>
</cc:interface>

<cc:implementation>
    <table data-role="table" data-mode="#{cc.attrs.mode}" id="my-table">
        <thead>
            <tr>
                <ui:repeat value="#{component.getCompositeComponentParent(component).children}" var="child">
                    <th>
                        <h:outputText value="#{child.attrs.header}"/>
                    </th>
                </ui:repeat>
            </tr>
        </thead>
        <tbody>
            <ui:repeat value="#{cc.attrs.value}" var="object">
                <tr>
                    <c:forEach items="#{cc.children}" var="child" varStatus="loop">
                        <cc:insertChildren/>
                    </c:forEach>
                </tr>
            </ui:repeat>
        </tbody>
    </table>
</cc:implementation>

А это композитный столбец.

<cc:interface>
    <cc:attribute name="header" />
    <cc:attribute name="property" />
    <cc:facet name="content"/>
</cc:interface>

<cc:implementation>
    <td><cc:insertChildren/></td>
</cc:implementation>

thead работает автономно

tbody работает автономно

Собрав их вместе, как указано выше, я получаю только tbody. thead всегда остается пустым Любые предложения? Заранее спасибо за помощь!


person CrisbyJ    schedule 07.03.2013    source источник
comment
<table id="my-table — обход пространства имен идентификатора JSF. В общем: не делайте этого - вы должны устанавливать идентификаторы только для компонентов JSF, а не для основных тегов HTML. В этом случае в составном компоненте у вас должен быть базовый HTML-тег верхнего уровня, но его идентификатор должен быть равен #{cc.clientId}. Таким образом, update="your_comp" будет работать.   -  person Vsevolod Golovanov    schedule 26.05.2017


Ответы (4)


Это не ошибка, это действительно работает так, как задумано в мохарре. Использование cc:insertChildren перемещает дочерние элементы в родительский тег тега cc:insertChildren. Эта задача эквивалентна другой задаче и имеет такое же решение. См. мой ответ на этот вопрос.

По сути, вы помещаете <ui:fragment> вокруг <cc:insertChildren>, привязываете этот фрагмент к свойству в bean-компоненте FacesComponent.

person Leo Mekenkamp    schedule 24.07.2015

#{cc.children}, который эквивалентен #{component.getCompositeComponentParent(component).children}, должен работать, но по какой-то причине не работает в некоторых версиях, я думаю, что эта часть JSF все еще немного глючит.

Ты пытался

 #{cc.getFacets().get('javax.faces.component.COMPOSITE_FACET_NAME').children}

Пожалуйста, обратитесь также к этой теме,

Как в JSF2 узнать, есть ли у составного компонента дочерние элементы?

person Avinash Singh    schedule 07.03.2013
comment
Я только что попробовал, но на самом деле не работает. Единственный дочерний элемент — это сама реализация. Поэтому вывод для #{child} будет следующим: ‹table data-role=table data-mode=#{cc.attrs.mode} id=my-table› ‹thead› ‹tr› com.sun.faces.facelets.component.UIRepeat@7f66ff9c ‹/tr› ‹/thead› ‹tbody› com.sun.faces.facelets.component.UIRepeat@430a14ad ‹/tbody› ‹/table› - person CrisbyJ; 07.03.2013

У меня была такая же проблема. Мой обходной путь состоял в том, чтобы использовать renderFacet вместо insertChildren.

Для перебора вставленных элементов я использовал: #{cc.facets.yourFacetName.children} и для вставки самих элементов я использовал: <composite:renderFacet name="yourFacetName"/>.

person Felipe Reis    schedule 22.03.2013

Я обнаружил, что перебор дочерних элементов и с использованием <composite:insertChildren /> в одном и том же компоненте практически невозможен. По крайней мере, в реализации Mojarra 2.2.6.

Промежуточный подход мне тоже не помог.

В конце концов, мое решение состояло в следующем:

  1. сохранить дочерний компонент (вкладку) как есть
  2. удалить весь код из композита: реализация родительского (группа вкладок) компонента
  3. реализовать encodeAll() в компоненте лиц, соответствующем родительскому

Этому вопросу больше года. Пожалуйста, поделитесь, если есть более простое решение.

person Timir    schedule 10.12.2014