2017-04-11 99 views
1

从primefaces dataTable创建复合组件时出现以下错误。我究竟做错了什么 !?'组件不支持事件'在创建p:dataTable复合组件时出错

Exception 

    javax.faces.view.facelets.TagException: /view/restrito/basico/municipio.xhtml @77,165 <p:ajax> Composite component does not support event rowSelect 

tabela-padrao.xhtml

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:cc="http://xmlns.jcp.org/jsf/composite" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:f="http://xmlns.jcp.org/jsf/core" 
    xmlns:h="http://xmlns.jcp.org/jsf/html"> 

<!-- INTERFACE --> 
<cc:interface> 
    <cc:attribute name="uniqueId" required="true" /> 
    <cc:attribute name="value" required="true" /> 
    <cc:attribute name="var" required="true" /> 
    <cc:attribute name="selection" required="true" /> 
    <cc:attribute name="exportedFileName" required="true" /> 
    <cc:attribute name="renderedTable" default="true"/> 
    <cc:attribute name="primaryKey" required="true"/> 

</cc:interface> 

<!-- IMPLEMENTATION --> 
<cc:implementation> 
    <p:dataTable value="#{cc.attrs.value}" 
       id="#{cc.attrs.uniqueId}" 
       scrollable="true" 
       scrollWidth="100%" 
       var="#{cc.attrs.var}" 
       rendered="#{cc.attrs.renderedTable}" 
       selection="#{cc.attrs.selection}" 
       rowKey="#{cc.attrs.primaryKey}"            
       selectionMode="single" 
       paginator="true" 
       rowsPerPageTemplate="15,30,45" 
       paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown} {Exporters}" 
       emptyMessage="#{bundle.tabela_nenhum_registro_encontrado}"> 
     <cc:insertChildren/> 
     <f:facet name="{Exporters}"> 
      <h:commandLink style="padding: 5px 5px 5px 5px ;" title="Converter para Excel" >            
       <h:outputText styleClass="fa fa-file-excel-o Fs20"/> 
       <p:dataExporter type="xls" target="#{cc.attrs.uniqueId}" fileName="#{cc.attrs.exportedFileName}" /> 
      </h:commandLink> 
      <h:commandLink style="padding: 5px 5px 5px 5px ;" title="Converter para PDF" > 
       <h:outputText styleClass="fa fa-file-pdf-o Fs20"/> 
       <p:dataExporter type="pdf" target="#{cc.attrs.uniqueId}" fileName="#{cc.attrs.exportedFileName}"/> 
      </h:commandLink> 
     </f:facet> 
    </p:dataTable> 
</cc:implementation> 

使用复合组件/于山岛Øcomponente

<h:form id="tabela-municipio"> 
        <ezcomp:tabela-padrao value="#{municipioMB.listaMunicipios}" 
              uniqueId="id-tabela-municipio" 
              var="mun" 
              primaryKey="#{mun.id}" 
              selection="#{municipioMB.municipio}" 
              exportedFileName="municipios"> 
         <p:ajax event="rowSelect" listener="#{municipioMB.onRowSelect}" update="@(form[id*='frm-municipio']),@(form[id*='tabela-municipio'])" /> 
         <p:ajax event="rowUnselect" listener="#{municipioMB.onRowUnselect}" update="@(form[id*='frm-municipio']),@(form[id*='tabela-municipio'])" /> 
         <p:column headerText="Pais" width="300" filterBy="#{mun.estado.pais.nome}" filterMatchMode="contains"> 
          <h:outputText value="#{mun.estado.pais.nome}"/> 
         </p:column> 
         <p:column headerText="Estado" width="300" filterBy="#{mun.estado.sigla} - #{mun.estado.nome}" filterMatchMode="contains"> 
          <h:outputText value="#{mun.estado.sigla} - #{mun.estado.nome}"/> 
         </p:column> 
         <p:column headerText="Município" filterBy="#{mun.nome}" filterMatchMode="contains"> 
          <h:outputText value="#{mun.nome}"/> 
         </p:column> 
        </ezcomp:tabela-padrao> 
       </h:form> 

回答

4

你必须创建和你复合注册自定义事件组件并将相应的动作传递给数据表。由于rowSelect和rowUnselect事件在数据表上注册,而不是复合组件。使用clientBehavior为复合组件注册事件。

<cc:interface> 
    ... 
    <cc:clientBehavior name="customRowSelectEvent" targets="idOfDataTable" event="rowSelect" /> 
    <cc:clientBehavior name="customRowUnselectEvent" targets="idOfDataTable" event="rowUnselect" /> 
</cc:interface> 
  1. 名称是自定义事件的名称。
  2. 目标是要为其实际注册动作的组件的标识。在你的数据表格的情况下。
  3. 事件是您想为数据表注册的实际事件。

现在注册复合组件的事件。

<ezcomp:tabela-padrao ....> 
    <f:ajax event="customRowSelectEvent" listener="#{municipioMB.onRowSelect}" update="@(form[id*='frm-municipio']),@(form[id*='tabela-municipio'])" /> 
    <f:ajax event="customRowUnselectEvent" listener="#{municipioMB.onRowUnselect}" update="@(form[id*='frm-municipio']),@(form[id*='tabela-municipio'])" /> 
     .....     
</ezcomp:tabela-padrao> 
+0

我得到了这个异常/ Ocorreu estaexceção!对于servlet,Faces Servlet引发异常 java.lang.IllegalArgumentException –

+0

因此,这是您的初始问题(您所遇到的错误已消失)的答案。新问题需要提出新问题,但当然要先从您的方面进行调查。请接受答案 – Kukeltje

+0

你是对的!谢谢 ! –