Использование одного идентификатора компонента (dataTable) внутри составного компонента - PullRequest
3 голосов
/ 01 ноября 2011

Как я могу использовать идентификатор компонента DataTable (Primefaces 2.2.1) внутри Composite Component в Java Server Faces 2.1?

Теперь у меня есть представление:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:p="http://primefaces.prime.com.tr/ui"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:haiq="http://java.sun.com/jsf/composite/haiqcomponents"
                template="/WEB-INF/templates/login/main.xhtml">

    <ui:define name="content">
        <h:form prependId="false">  <!-- prependId="true" ??? -->
            <p:dataTable id="leakTable" var="leak" value="#{dataExplorer.data}">   

                <p:column filterBy="#{leak.source}" headerText="source" footerText="source" filterMatchMode="contains" >  
                    <f:facet name="header">  
                        <h:outputText value="source" />  
                    </f:facet>  
                    <h:outputText value="#{leak.source}"  />  
                </p:column>  

                <!-- Few more columns here -->
            </p:dataTable> 

            <!-- Add : prefix before ID? -->
            <haiq:exporter target=":leakTable" fileName="#{msgs.fileName}" imageLibrary="images" pageOnly="false" />

        </h:form>   
    </ui:define>
</ui:composition>

Мой составнойкомпонент:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:cc="http://java.sun.com/jsf/composite"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:p="http://primefaces.prime.com.tr/ui">

<!-- INTERFACE -->
<cc:interface>
    <cc:attribute name="fileName" default="data" />
    <cc:attribute name="target" required="true" type="java.lang.String" />
    <cc:attribute name="pageOnly" default="true" type="java.lang.Boolean" />
    <cc:attribute name="imageLibrary" default="images" />
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>
    <h:commandLink>  
        <h:graphicImage library="#{cc.attrs.imageLibrary}" name="excel.png" />  
        <p:dataExporter type="xls"
                        target="#{cc.attrs.target}" 
                        fileName="#{cc.attrs.filename}" 
                        pageOnly="#{cc.attrs.pageOnly}" />  
    </h:commandLink>  
</cc:implementation>
</html>

После рендеринга представления произошла следующая ошибка:

javax.faces.FacesException: Cannot find component ":leakTable" in view.
at org.primefaces.component.export.DataExporter.processAction(DataExporter.java:89)
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
at javax.faces.component.UICommand.broadcast(UICommand.java:300)

Удаление: до тех пор, пока значение параметра leakTable (в целевом атрибуте) или изменение значения preperndId (в форме) на true не устранитпроблема.

Как я могу использовать datatable внутри cc?Подобная проблема описана здесь

1 Ответ

2 голосов
/ 01 ноября 2011

Очевидно, у вас есть еще один NamingContainer родитель в представлении.Чтобы быть уверенным, откройте страницу в браузере, щелкните правой кнопкой мыши и Просмотр источника и определите сгенерированный идентификатор <p:dataTable id="leakTable">.Затем вы должны получить именно этот идентификатор и префикс с помощью :.

. В качестве альтернативы, вы также можете привязать компонент таблицы к представлению и использовать вместо него UIComponent#getClientId(), чтобы динамически ссылаться на клиентаID.

<p:dataTable binding="#{leakTable}" ...>

с

<haiq:exporter target=":#{leakTable.clientId}" ...>

Не связано с конкретной проблемой, я предлагаю заменить <!DOCTYPE><html> вашего композита на <ui:component>, что более естественно, и также спасает JSF от неумышленного выполнения каждый раз.

<ui:component
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:p="http://primefaces.prime.com.tr/ui">

См. Также https://stackoverflow.com/tags/composite-component/info.

...