2017-10-05 2 views
0

Ich habe grundsätzlich zwei Eingabefeld ich zeige, wenn der Wert derzeit leer oder Null ist. Ist dies nicht der Fall, zeige ich einen outputText an. Diese beiden Werte sind Währungswerte, die in einem Long-Objekt gespeichert sind, und ich verwende einen Konverter, um die Daten richtig anzuzeigen (ich kann PrimeFaces 'inputNumber nicht verwenden, da ich PrimeFaces 5.3 verwende). Mein Problem ist folgendes:Wie aktualisiere ich ein Feld mit einem Konverter und Ajax in JSF

<c:set var="edtVal1" value="#{bean.val1 ne null and bean.val1 ne 0}" scope="request" /> 
<c:set var="edtVal2" value="#{bean.val2 ne null and bean.val2 ne 0}" scope="request" /> 

<p:panelGrid> 
    <p:row> 
     <p:column colspan="2"> 
      <p:messages id="mainMessages" globalOnly="false" autoUpdate="true" showDetail="true" /> 
     </p:column> 
    </p:row> 
    <!-- [...] --> 

    <p:row> 
     <p:column styleClass="col-quarter col-label2"> 
      <h:outputText value="value 1" /> 
     </p:column> 
     <p:column styleClass="col-quarter col-value2" rendered="#{edtVal1}"> 
      <h:outputText id="val1Output" value="#{bean.val1}" converter="myConverter" /> 
     </p:column> 
     <p:column styleClass="col-quarter" rendered="#{not edtVal1}"> 
      <p:inputText id="val1Input" value="#{bean.val1}" converter="myConverter"> 
       <p:ajax update="mainMessages val1Input" event="change" /> 
      </p:inputText> 
     </p:column> 
    </p:row> 
    <p:row> 
     <p:column styleClass="col-quarter col-label2"> 
      <h:outputText value="value 2" /> 
     </p:column> 
     <p:column styleClass="col-quarter col-value2" rendered="#{edtVal2}"> 
      <h:outputText id="val1Output" value="#{bean.val2}" converter="myConverter" /> 
     </p:column> 
     <p:column styleClass="col-quarter" rendered="#{not edtVal2}"> 
      <p:inputText id="val1Input" value="#{bean.val2}" converter="myConverter"> 
       <p:ajax update="mainMessages val1Input" event="change" /> 
      </p:inputText> 
     </p:column> 
    </p:row> 
</p:panelGrid> 

, wenn ich es so sagen, die durch den Wandler geworfen Nachrichten werden angezeigt, aber keines der Felder werden aktualisiert. wenn ich die gleiche Boolesche Variable für beide Eingabe/Ausgabe-Optionen (verändert die Variable verwendet in rendered Attribut der 1rst Datenzeile edtVal2 in beide verwenden) verwenden, aber in etwa so:

<p:row> 
    <p:column styleClass="col-quarter col-label2"> 
     <h:outputText value="value 1" /> 
    </p:column> 
    <p:column styleClass="col-quarter col-value2" rendered="#{edtVal1}"> 
     <h:outputText id="val1Output" value="#{bean.val1}" converter="myConverter" /> 
    </p:column> 
    <p:column styleClass="col-quarter" rendered="#{not edtVal1}"> 
     <p:inputText id="val1Input" value="#{bean.val1}" converter="myConverter"> 
      <p:ajax update="mainMessages val1Input" event="change" /> 
     </p:inputText> 
    </p:column> 
</p:row> 

Die ersten Feldaktualisierungen erfolgreich und die zweite funktioniert noch immer nicht.

Die Verwendung eines Konverters zum Anzeigen formatierter Daten ist ein Workaround, den ich bereits durchgeführt habe, und es funktioniert wie erwartet und ich benutze denselben Konverter wie zuvor. Aber dieses Mal verstehe ich nicht, warum es nicht funktioniert.

Der Konverter ist wichtig, um das Problem zu reproduzieren, aber jeder benutzerdefinierte Konverter scheint die Aufgabe zu erledigen.

+0

Sie sollten Ihren Titel ernsthaft verbessern ... Lesen Sie [fragen], es enthält Vorschläge, wie man einen guten Titel schreibt. Und lesen Sie [mcve] und http://www.stackoverflow.com/tags/jsf/info – Kukeltje

+0

Ich stimme zu, die Frage ist ziemlich lang, aber es ist minimal: Mein Problem hat eine verschwommene Ursache und ich habe versucht, es für 2 Stunden zu lösen . Ich denke nicht, dass diese Frage einen Vorwand verdient, vor allem mit dem Aufwand, den ich gemacht habe, um die Frage so genau wie möglich zu formulieren. – Sirmyself

+0

Dennoch sollten Sie einen Text hinzufügen, um die Unterschiede zwischen dem ersten und zweiten Panelgrid zu erklären. Jetzt liegt es an den Leuten, die helfen wollen, die Unterschiede zu finden, und es ist kein [mcve] ;-) – Kukeltje

Antwort

0

Alle anderen Lösungen sind immer noch willkommen zu diesem Beitrag, aber ich schaffte es eine funktionierende Lösung zu finden:

, wenn ich das rendered Attribut auf einen konstanten String geändert, das Problem war nicht vorhanden. Also ich denke das Problem kommt als Missverständnis von <c:set>.

Meine Lösung war eine Bohne als Controller zu verwenden. Ich habe die Variablen aus der XHTML-Datei in Eigenschaften im Controller geändert und jetzt funktioniert alles einwandfrei. Also habe ich alle <c:set> aus meinem xhtml entfernt und verwende jetzt ein passendes MVC-Muster auf dieser Seite.


Hinweis:
Für diejenigen, die nicht wissen, was MVC ist: es ist ein ordentliches architektonisches Muster, das eindeutig die Benutzeroberfläche und die manipulierten Daten aufteilt. Erfahren Sie mehr on wikipedia.

Verwandte Themen