2016-05-04 12 views
0

Eine Combobox ist an eine Java-Bean gebunden. Dokumente werden im Lesemodus geöffnet und der ausgewählte Wert wird angezeigt.Xpages: Combobox behält keinen Wert beim Übergang vom Lese- zum Bearbeitungsmodus

enter image description here

Aber wenn ich in den Edit-Modus wird der Wert "verloren".

enter image description here

Ich möchte auf der Seite machen zwei Felder vermeiden, aber ich denke, ich kann, wenn ich muss. Aber es scheint, dass mit meinem Code oder meinem Ansatz etwas nicht stimmt.

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xe="http://www.ibm.com/xsp/coreex" 
    xmlns:xc="http://www.ibm.com/xsp/custom"> 
    <xp:this.afterPageLoad><![CDATA[#{javascript:sessionScope.models = PCConfig.models; 
viewScope.readOnly = "Yes";}]]></xp:this.afterPageLoad> 
    <xp:button value="Toggle Edit Mode" id="button1"> 
     <xp:eventHandler event="onclick" submit="true" 
      refreshMode="complete"> 
      <xp:this.action><![CDATA[#{javascript:if (viewScope.readOnly == "Yes") 
{viewScope.readOnly = "No"} 
else 
{viewScope.readOnly = "Yes"}}]]></xp:this.action> 
     </xp:eventHandler> 
    </xp:button> 
    <xp:br></xp:br> 
    <xp:br></xp:br> 
    <xp:text escape="true" id="computedField1" value="#{viewScope.readOnly}"></xp:text> 
    <xp:br></xp:br> 
    <xp:panel id="pnlAll"> 
     <xp:this.data> 
      <xe:objectData saveObject="#{javascript:PCModel.save()}" 
       var="PCModel"> 
       <xe:this.createObject><![CDATA[#{javascript:var pc = new com.scoular.model.PC(); 
var unid = sessionScope.get("key"); 

if (unid != null) { 
    pc.loadByUnid(unid); 
    sessionScope.put("key",""); 
    viewScope.put("readOnly","Yes"); 
} else { 
    pc.create(); 
    viewScope.put("readOnly","No"); 
} 
return pc;}]]></xe:this.createObject> 
      </xe:objectData> 
     </xp:this.data> 
     <xp:comboBox id="model" value="#{PCModel.model}" 
      disableValidators="true" disableClientSideValidation="true" 
      styleClass="form-control"> 
      <xp:this.attrs> 
       <xp:attr name="disabled" value="disabled"> 
        <xp:this.rendered><![CDATA[#{javascript:if (viewScope.readOnly == "Yes") 
{return true} 
else 
{return false}}]]></xp:this.rendered> 
       </xp:attr> 
      </xp:this.attrs> 
      <xp:selectItems> 
       <xp:this.value><![CDATA[#{javascript:"--Select A Value--|"}]]></xp:this.value> 
      </xp:selectItems> 
      <xp:selectItems> 
       <xp:this.value><![CDATA[#{javascript:sessionScope.models}]]></xp:this.value> 
      </xp:selectItems> 
     </xp:comboBox> 
    </xp:panel> 
</xp:view> 

Antwort

1

Code ersetzen für comboBox Eigentum disabled

<xp:comboBox 
     id="model" 
     value="#{PCModel.model}" 
     ...> 
     <xp:this.attrs> 
      <xp:attr name="disabled" value="disabled"> 
       <xp:this.rendered><![CDATA[#{javascript:if 
        (viewScope.readOnly == "Yes") 
         {return true} 
        else 
         {return false}}]]></xp:this.rendered> 
      </xp:attr> 
     </xp:this.attrs>      

von

<xp:comboBox 
     id="model" 
     value="#{PCModel.model}" 
     ... 
     disabled="#{javascript:viewScope.readOnly == 'Yes'}"> 

Scheint Einstellung comboBox nicht richtig mit Behinderten Einstellung von attr umgehen kann (während es funktioniert gut für ein inputText-Steuerelement).
Aber comboBox direkte Eigenschaft disabled ist besser zu handhaben als durch attrs/attr Code sowieso.

+0

Außerdem werden gerenderte Berechnungen während des partiellen Refresh-Lebenszyklus mehrmals ausgeführt, was ebenfalls zu einer (wenn auch geringen) Leistungsverbesserung führt. Außerdem haben Panels eine schreibgeschützte Eigenschaft. Abhängig von Ihren Funktionen und Anforderungen kann dies ein alternativer Ansatz sein, insbesondere wenn Sie mehrere Komponenten im selben Panel haben. –

+0

Paul, ausgezeichnete Vorschläge. Mein Entwurf bedeutet, dass ich Gruppen von Feldern aktivieren/deaktivieren muss. Daher werde ich die Gruppen in separate Bereiche einfügen und auf dieser Ebene aktivieren/deaktivieren. –