2010-05-21 3 views
2

Le problème est que si une propriété est modifiée lors d'une requête f: ajax et qu'un groupe de panneaux lié doit être nouvellement créé en fonction de cette valeur modifiée, l'ancienne valeur est utilisée.JSF 2 f: problème de cycle de vie ajax

Ce code explique le problème.

Voici le backingbean TestBean:

public String getFirst() { 
     return first; 
    } 
    public void setFirst(String first) { 
     this.first = first; 
    } 
    public String getLast() { 
     return last; 
    } 
    public void setLast(String last) { 
     this.last = last; 
    } 

    public String getName(){ 
     return first+" "+last; 
    } 
public void setDynamicPanel(HtmlPanelGroup panel){ } 

    public HtmlPanelGroup getDynamicPanel(){ 
     Application app = FacesContext.getCurrentInstance().getApplication(); 
     HtmlPanelGroup component = (HtmlPanelGroup)app.createComponent(HtmlPanelGroup.COMPONENT_TYPE); 

     HtmlOutputLabel label1 = (HtmlOutputLabel)app.createComponent(HtmlOutputLabel.COMPONENT_TYPE); 
     label1.setValue(" --> "+getFirst()+" "+getLast()); 
     component.getChildren().add(label1); 
     return component; 
    } 

et maintenant le JSF/code Facelet:

<h:form id="form"> 
    <h:panelGrid columns="1"> 
     <h:inputText id="first" value="#{testBean.first}" /> 
     <h:inputText id="last" value="#{testBean.last}" /> 
     <h:commandButton value="Show"> 
      <f:ajax execute="first last" render="name dyn" /> 
     </h:commandButton> 
    </h:panelGrid> 
    <h:outputText id="name" value="#{testBean.name}" /> 
    <h:panelGroup id="dyn" binding="#{testBean.dynamicPanel}" /> 
</h:form> 

Une fois la page a été initialement chargé le outputText et panelGroup montre à la fois "null" en tant que premier et dernier. Mais après que le bouton est pressé, le outputText est bien mis à jour, mais le groupe de panneaux affiche à nouveau seulement "null". Cela est dû au problème, que la "méthode liée" dynamicPanel est exécutée avant la mise à jour des première et dernière propriétés.

comment contourner ce problème ou ce qui ne va pas avec mon code?

Répondre

2

Si vous ajoutez l'attribut immediate = "true" à vos éléments d'entrée, les valeurs seront appliquées pendant la phase "Apply Request Values" et seront donc présentes avant l'exécution de votre action. Vous pouvez également avoir besoin de l'attribut immédiat défini sur true sur le commandButton.

+0

Y a-t-il des inconvénients? L'utilisation de 'immediate =" true "' introduit-elle des astuces supplémentaires ou supprime-t-elle le support de quelque chose X? –

+0

Cela signifie que vous ignorez la validation pour cette entrée. Cela peut être mauvais si vous avez besoin de corriger les données dans la propriété de bean backing "immédiat". Par exemple si vous vouliez exiger que les éléments d'entrée soient des entiers ou quelque chose comme ça. –