2017-10-05 13 views
0

J'ai essentiellement deux champ d'entrée I d'affichage si la valeur est actuellement vide ou nulle. si ce n'est pas le cas, j'affiche un outputText. Ces deux valeurs sont des valeurs de devises stockées dans un objet Long et j'utilise un convertisseur pour afficher les données correctement (je ne peux pas utiliser le numéro d'entrée de PrimeFaces puisque j'utilise PrimeFaces 5.3). Mon problème est le suivant:Comment mettre à jour un champ en utilisant un convertisseur et ajax dans 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> 

quand je mets comme ça, les messages lancés par le convertisseur sont affichés, mais aucun des champs sont mis à jour. Cependant, si j'utilise la même variable booléenne pour les entrées/options de sortie (changé la variable utilisée dans rendered attribut de la ligne de données 1ère à utiliser edtVal2 dans les deux) comme ceci:

<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> 

Les premières mises à jour sur le terrain avec succès et la seconde fois ne fonctionne toujours pas. L'utilisation d'un convertisseur pour afficher une donnée formatée est une solution de contournement que j'ai déjà faite et cela fonctionne comme prévu et j'utilise le même convertisseur qu'avant. Mais cette fois, je ne comprends pas pourquoi ça ne marche pas.

Le convertisseur est important pour reproduire le problème, mais tout convertisseur personnalisé semble faire l'affaire.

+0

Vous devriez sérieusement améliorer votre titre ... Lire [demander], il contient des suggestions sur la façon d'écrire un bon titre. Et lire [mcve] et http://www.stackoverflow.com/tags/jsf/info – Kukeltje

+0

Je suis d'accord que la question est assez longue, mais elle est minime: mon problème a une cause floue et j'ai essayé de le résoudre pendant 2 heures . Je ne pense pas que cette question mérite un downvote, surtout avec l'effort que j'ai fait pour formuler la question aussi précisément que possible. – Sirmyself

+0

Mais encore, vous devriez ajouter du texte pour expliquer les différences entre le premier et le second «panelgrid». Maintenant, il appartient aux personnes désireuses d'aider à trouver les différences et ce n'est pas un [mcve] ;-) – Kukeltje

Répondre

0

Toutes les autres solutions sont toujours les bienvenus sur ce post, mais je réussi à trouver une solution de travail:

quand j'ai changé l'attribut rendered à une chaîne constante, la question était absent. Donc, je pense que le problème vient d'un malentendu de <c:set>.

Ma solution était d'utiliser un haricot comme contrôleur. J'ai changé les variables du fichier xhtml en propriétés dans le contrôleur et maintenant tout fonctionne bien. J'ai donc supprimé tous les <c:set> de mon xhtml et j'utilise maintenant un modèle MVC approprié sur cette page.


Note:
Pour ceux qui ne savent pas ce que MVC est: il est un modèle architectural propre qui divise clairement l'interface utilisateur et les données manipulées. En savoir plus on wikipedia.