2017-01-30 3 views
0

ist der xhtml Teil meines Verbundbauteils:JSF Composite-Komponente deaktiviert Attribut

<cc:interface componentType="partnerSelComp"> 
     <cc:attribute name="value" type="java.lang.Long"/>    
     <cc:attribute name="disabled" type="java.lang.Boolean" default="#{false}"/>    
     <cc:attribute name="service"/> 
    </cc:interface> 

    <cc:implementation> 
     <span id="#{cc.clientId}" style="white-space:nowrap">         
      <p:inputText id="id" type="hidden" binding="#{cc.partnerId}"/> 
      <p:inputText id="code" 
         binding="#{cc.partnerCode}" 
         disabled="#{cc.attrs.disabled}" >      
       <p:ajax event="blur" update="code name msg" listener="#{cc.validate}" />                          
      </p:inputText>    
      <p:inputText id ="name" 
         disabled="true" 
         binding="#{cc.partnerName}" />     
      <p:message id="msg" for="code"/>     
     </span> 
    </cc:implementation> 

Ich nenne es auf diese Weise:

<my:PartnerSelComp id="partnerSel" value="#{myBean.partner}" service="#{partnerService}" disabled="true"/> 

Wenn Komponente gerendert zunächst die code Komponente erscheint editierbare Ereignis obwohl disabled="true" angegeben. Aber nach dem ersten Ajax Blur-Ereignis (ich denke, weil die update) wird es den richtigen deaktivierten Zustand erhalten. Abfrage der Wert in Backing-Komponente getAttributes().get("disabled") Ich kann den richtigen Wert sehen. Warum ist es? Wie kann ich das Aussehen der Komponente festlegen?


Ich konnte es beheben. Ich würde keine Lösung eher sagen, eine nicht zu elegant Abhilfe:

@Override 
public void encodeAll(FacesContext context) throws IOException { 

    Boolean b = (Boolean) getAttributes().get("disabled"); 
    partnerCode.setDisabled(b); 
    super.encodeAll(context); 
} 

ich mich freuen würde, wenn ich könnte verstehen, was das Problem mit Original ist.

Antwort

-1

die Sie interessieren,

<cc:attribute name="disabled" type="java.lang.String" default="false"/> 

Und ersetzen:

<span id="#{cc.clientId}" style="white-space:nowrap"> 

von

<p:panel id="#{cc.clientId}" style="white-space:nowrap"> 
+0

Können Sie erklären, warum Sie denken, das ist die Lösung? – Kukeltje

+0

für das Attribut cc: Sie müssen die Lebensdauer nicht mit einem booleschen Wert komplizieren. das Wahre | false string oder boolean sind gleich. Für das p: panel verwenden Sie p: ajax, also müssen Sie eine jsf-Komponente nicht direkt in html aktualisieren. – bilelovitch

+0

Kompliziert oder nicht, wäre es ein ** Problem ** mit einem Boolean? (und der Downvote ist nicht von mir übrigens). Und warum gibt es ein "span" eine id ein Problem? Ich sage nicht, dass du falsch liegst, ich versuche zu lernen und detailliertere Informationen für andere zu bekommen, damit sie auch lernen können – Kukeltje

Verwandte Themen