2013-05-02 2 views
1

복합 JSF 2 컴포넌트를 개발했으며 매우 잘 작동합니다. 사용자 지정 구성 요소를 사용하는 페이지 중 하나에서 복합 구성 요소를 부울 조건에 따라 렌더링해야합니다. 렌더링 된 속성과 거의 비슷 JSF 표준 구성 요소에서 작동합니다. 부울 조건을 기반으로 복합 컴포넌트 렌더링

그래서 나는이 같은 그것을 구현하는 시도 : 나는 복합 구성 요소를 삽입 페이지에서

<cc:interface componentType="ciudadComponent"> 
     <cc:attribute name="paises" type="java.util.List" required="true" /> 
     <cc:attribute name="departamentos" type="java.util.List" required="true" /> 
     <cc:attribute name="ciudades" type="java.util.List" required="true" /> 
     <cc:attribute name="name" type="java.lang.String" required="true" /> 
     <cc:attribute name="value" type="org.colfuturo.model.to.CiudadTO" required="true"## Heading ## /> 
     <cc:attribute name="etiquetaPais" type="java.lang.String" /> 
     <cc:attribute name="etiquetaBotonOK" type="java.lang.String" /> 
     <cc:attribute name="etiquetaBotonCancelar" type="java.lang.String" /> 
     <cc:attribute name="etiquetaDepartamento" type="java.lang.String" /> 
     <cc:attribute name="etiquetaCiudad" type="java.lang.String" /> 
     <cc:attribute name="styleClass" type="java.lang.String" /> 
     <cc:attribute name="backGroundColor" type="java.lang.String" default="#b0c4de" /> 
     <cc:attribute name="rendered" type="java.lang.Boolean" required="false" default="true" /> 
    </cc:interface> 
    <cc:implementation> 
     <h:inputText id="seleccionado" binding="#{cc.seleccionado}" disabled="true" rendered="#{cc.rendered}"> 
      <f:converter converterId="CiudadConverter" /> 
     </h:inputText> 
    </cc:implementation> 

, 그것은 다음과 같이이다 :

<gambatte:ciudad 
    paises="#{menuTreeBean.listaPaises}" 
    departamentos="#{menuTreeBean.listaDepartamentos}" 
    ciudades="#{menuTreeBean.listaCiudades}" styleClass="mySelectStyle" 
    etiquetaBotonOK="#{msg['perfil.common.btnOK']}" etiquetaBotonCancelar="#{msg['perfil.common.btnCancelar']}" 
    etiquetaPais="#{msg['perfil.common.lblPais']}" 
    etiquetaDepartamento="#{msg['perfil.common.lblDepartamento']}" 
    etiquetaCiudad="#{msg['perfil.common.lblCiudad']}" name="otraSedeCiudad" 
    value="#{EstudiosRealizadosBean.otraSedeCiudad}" 
    rendered="#{EstudiosRealizadosBean.showOtraSede()}" /> 

메소드 EstudiosRealizadosBean.showOtraSede() 반환 java.lang.Boolean.

java.lang.IllegalArgumentException: rendered 

가 어떻게이 문제를 해결할 수 있습니다 : 페이지를 렌더링 할 때

나는 다음과 같은 예외를 얻을? 는 또한 부울 조건을 넣어 시도,하지만 같은 예외 내가 내 모든 구성 요소 코드를 게시하고

을 발생 :

<?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:c="http://java.sun.com/jstl/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:rich="http://richfaces.org/rich" 
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:cc="http://java.sun.com/jsf/composite"> 


<cc:interface componentType="ciudadComponent"> 
    <cc:attribute name="paises" type="java.util.List" required="true" /> 
    <cc:attribute name="departamentos" type="java.util.List" required="true" /> 
    <cc:attribute name="ciudades" type="java.util.List" required="true" /> 
    <cc:attribute name="name" type="java.lang.String" required="true" /> 
    <cc:attribute name="value" type="org.colfuturo.model.to.CiudadTO" required="true" /> 
    <cc:attribute name="etiquetaPais" type="java.lang.String" /> 
    <cc:attribute name="etiquetaBotonOK" type="java.lang.String" /> 
    <cc:attribute name="etiquetaBotonCancelar" type="java.lang.String" /> 
    <cc:attribute name="etiquetaDepartamento" type="java.lang.String" /> 
    <cc:attribute name="etiquetaCiudad" type="java.lang.String" /> 
    <cc:attribute name="styleClass" type="java.lang.String" /> 
    <cc:attribute name="backGroundColor" type="java.lang.String" default="#b0c4de" /> 
    <cc:attribute name="cacheInterface" type="org.colfuturo.business.interfaces.IServicioCache" required="false" /> 
</cc:interface> 

<cc:implementation> 
    <span id="#{cc.clientId}" style="white-space:nowrap"> 
     <h:inputText id="seleccionado" binding="#{cc.seleccionado}" disabled="true" > 
      <f:converter converterId="CiudadConverter" /> 
     </h:inputText> 
     <a4j:commandButton execute="@none" immediate="true" value=".." oncomplete="document.getElementById('#{cc.attrs.name}').style.position = 'absolute'; document.getElementById('#{cc.attrs.name}').style.display = 'inline-block';" /> 
     <br /> 
     <ui:fragment> 
     <div id="#{cc.attrs.name}" layout="block" style="border-radius: 10px; background-color:#{cc.attrs.backGroundColor}; display:none;" > 
      <table border="0"> 
       <tr> 
        <td><h:outputText value="#{cc.attrs.etiquetaPais}" /></td> 
        <td> 
         <rich:select id="pais" binding="#{cc.pais}" styleClass="#{cc.attrs.styleClass}" defaultLabel="Seleccione un País" > 
          <f:selectItems value="#{cc.listaPaises}" /> 
          <f:ajax event="selectitem" execute="@this" listener="#{cc.updatePais}" /> 
         </rich:select> 
        </td>     
       </tr> 
       <tr> 
        <td><h:outputText value="#{cc.attrs.etiquetaDepartamento}" /></td> 
        <td> 
         <rich:select id="departamento" binding="#{cc.departamento}" styleClass="#{cc.attrs.styleClass}" defaultLabel="Seleccione un Departamento" > 
          <f:selectItems value="#{cc.listaDepartamentos}" /> 
          <f:ajax event="selectitem" execute="@this" listener="#{cc.updateDepartamento}" /> 
         </rich:select> 
         <a4j:outputPanel layout="block" binding="#{cc.panelOtroDepartamento}" > 
          <h:inputText id="otroDepartamento" binding="#{cc.otroDepartamento}" > 
           <f:ajax event="keyup" listener="#{cc.enableSubmit}" execute="@this otraCiudad" /> 
          </h:inputText> 
         </a4j:outputPanel> 
        </td>     
       </tr> 
       <tr> 
        <td><h:outputText value="#{cc.attrs.etiquetaCiudad}" /></td> 
        <td> 
         <rich:select id="ciudad" binding="#{cc.ciudad}" styleClass="#{cc.attrs.styleClass}" defaultLabel="Seleccione una Ciudad" > 
          <f:selectItems value="#{cc.listaCiudades}" /> 
          <f:ajax event="selectitem" execute="@this" listener="#{cc.updateCiudad}" /> 
         </rich:select> 
         <a4j:outputPanel layout="block" binding="#{cc.panelOtraCiudad}" > 
          <h:inputText id="otraCiudad" binding="#{cc.otraCiudad}" > 
           <f:ajax event="keyup" listener="#{cc.enableSubmit}" execute="@this otroDepartamento" /> 
          </h:inputText> 
         </a4j:outputPanel> 
        </td> 
       </tr> 
       <tr> 
        <td> 
         <h:commandButton value="#{cc.attrs.etiquetaBotonOK}" disabled="true" binding="#{cc.botonAcccion}" onclick="document.getElementById('#{cc.attrs.name}').style.position = 'absolute'; document.getElementById('#{cc.attrs.name}').style.display = 'none';" > 
          <f:ajax execute="ciudad" listener="#{cc.submit}" /> 
         </h:commandButton>  
        </td> 
        <td> 
         <a4j:commandButton value="#{cc.attrs.etiquetaBotonCancelar}" execute="@none" immediate="true" oncomplete="document.getElementById('#{cc.attrs.name}').style.position = 'absolute'; document.getElementById('#{cc.attrs.name}').style.display = 'none';" /> 
        </td> 
       </tr> 
      </table> 
     </div> 
     </ui:fragment> 
     <div style="display:block;" ></div> 
    </span> 
</cc:implementation> 

</html> 
+0

시도해 보셨습니까? ? –

답변

4

<cc:attribute name="rendered"> 제거하십시오.

alreadyUIComponent 클래스로 정의되며, <cc:implementation>에서부터 확장됩니다. 다시 정의 할 필요가 없습니다. 그런 이야기는 idbinding 속성에 적용됩니다.

복합 컴포넌트의 첫 번째 자식에 rendered="#{cc.rendered}"을 다시 적용 할 필요가 없습니다. 당신은 또한 그것을 제거 할 수 있습니다. <my:composite rendered>은 이미 복합 컴포넌트 전체에 적용됩니다.

+0

답장을 보내 주셔서 감사합니다. 제안한대로했는데 내 사용자 지정 구성 요소에 렌더링 된 특성을 추가하여 해당 지점의 페이지를 렌더링하지 않습니다 – Deibys

+0

Mojarra 2.1.21에서 문제를 재현 할 수 없습니다. 어떤 JSF impl/version을 사용하고 있습니까? – BalusC

관련 문제