2011-10-10 5 views
4

J'ai une page à deux onglets, un onglet est la liste des enregistrements, cliquez sur l'enregistrement passera à l'onglet Modifier, et il y a Enregistrer et Annuler les boutons dans le languette.JSF immédiat = "true" pour annuler le bouton ne fonctionne pas

Maintenant, je clique sur l'enregistrement # 1, je fais quelques modifications et je clique sur le bouton Annuler. Certainement je ne veux pas valider le formulaire parce qu'il est annulé, ainsi j'ai placé immediate="true" sur le bouton d'annulation. Maintenant, l'onglet d'édition est fermé, retour à la liste des enregistrements. Ensuite, je clique sur un autre enregistrement # 2, le problème est survenu: Dans l'onglet d'édition, c'est toujours le contenu précédent de l'enregistrement n ° 1, plutôt que l'enregistrement n ° 2. J'ai vérifié les variables dans la vue de débogage, le bean arrière pour le formulaire d'édition a été réellement rempli avec l'enregistrement # 2.

C'est-à-dire, quelque chose de cassé après une commande immédiate.

(Tout avait été bien avant d'avoir ajouté la validation et immédiate = "true".)

class FormBean { 

    Record activeRecord; 
    ... 

    public void clickOnList() { 
     activeRecord = loadRecord(clickIndex); 
    } 

    public void cancelForm() { 
     activeRecord = null; 
    } 

} 

page.xhtml:

<h:form id="main"> 
    ... 
    <p:tab title="Edit" rendered="#{formBean.activeRecord != null}"> 
    ... 
    <p:commandButton value="Cancel" 
     actionListener="#{formBean.cancelForm}" 
     update="main" async="true" immediate="true" /> 
    </p:tab> 
</h:form> 

Répondre

17

Le immediate="true" ne fonctionne pas bien avec ajax demandes sur la même vue. Cela revient à dire que les valeurs soumises mais non validées sont toujours présentes dans les composants d'entrée. Sans ajax, une requête/réponse synchrone normale d'une soumission de formulaire subséquente permettrait de «résoudre» silencieusement ce problème. Mais avec ajax, cela n'arrive pas. Les valeurs soumises de la requête ajax précédente sont toujours présentes dans les composants d'entrée. Lorsque UIInput#getSubmittedValue() ne renvoie pas null, il sera affiché à la place, quelle que soit la valeur du modèle (modifié).

Fondamentalement, quand vous voulez coller à ajax pour un bouton d'annulation, vous devez ne comprennent pas les entrées d'être traitées au lieu de compter sur la immediate="true" (qui est en fait une sorte de bidouille). En termes standard JSF <f:ajax>, vous pouvez le faire avec execute="@this" (qui est en fait la valeur par défaut) sur le bouton au lieu de execute="@form". Les boutons PrimeFaces par défaut à @form, vous devez donc modifier cela:

<p:commandButton value="Cancel" 
    actionListener="#{formBean.cancelForm}" 
    update="main" async="true" process="@this" /> 
Questions connexes