Question

J'ai un cas où il existe un selectOneMenu qui a une valeur liée à un bean de support.

J'ai besoin d'un bouton qui ne mette pas à jour les valeurs du modèle (c'est pourquoi il a une propriété immediate = "quot" true).

La méthode d'action de ce bouton modifie la valeur à laquelle selectOneMenu est lié, mais lorsque la page est réaffiche, la valeur d'origine est affichée (celle qui a été soumise) et non celle définie dans la méthode d'action.

Des idées pour expliquer cela?

Si je n'ai pas expliqué le problème assez bien, faites-le-moi savoir.


MODIFIER: Comme demandé, voici le code source en question:

code de page:

<h:selectOneMenu id="selectedPerson" 
                 binding="#{bindings.selectPersonComponent}" 
                 value="#{bean.selectedPerson}">
   <s:selectItems var="op" value="#{bean.allPersons}" 
                  label="#{op.osoba.ime} #{op.osoba.prezime}" 
                  noSelectionLabel="#{messages.selectAPerson}">
   </s:selectItems>
   <f:converter converterId="unmanagedEntityConverter" />
</h:selectOneMenu>
...
<a4j:commandButton action="#{bean.createNew}" value="#{messages.createNew}"
     immediate="true" reRender="panelImovine">
</a4j:commandButton>

code java:

private Person selectedPerson;

public String createNew() {
    log.debug("New created...");
    selectedPerson = null;
    bindings.getSelectPersonComponent().setSubmittedValue(null); //SOLUTION
    return "";
}

La solution se trouve dans la ligne marquée SOLUTION :)

Était-ce utile?

La solution

Comme cela arrive souvent quelques instants après avoir posté cette question, j'ai trouvé une réponse:

La cause du problème est expliquée en détail ici: ClearInputComponents

Le problème est (comme expliqué) que les valeurs du modèle n'ont pas été mises à jour et que les entrées soumises sont toujours dans le champ composant.submittedValue et que ce champ est affiché s'il n'est pas vide. Il est vidé normalement après la mise à jour du modèle.

La première solution n'a pas fonctionné dans mon cas car il y a un autre état important dans la vue qui ne doit pas être perdu. Mais la deuxième solution a bien fonctionné:

component.setSubmittedValue(null);

Et c’est tout ce qui était nécessaire: c’est un peu plus de travail car les composants doivent être liés à un bean, mais pas si mal.

Autres conseils

Pour faire un suivi, je ne pense pas que vous deviez lier le composant à un bean. Vous pouvez simplement extraire le composant de l'instance FacesContext via UIViewRoot , si vous connaissez l'ID client du composant.

Cela donnerait un petit quelque chose comme ça:

Foo component = (Foo)FacesContext.getCurrentInstance().getViewRoot().getComponent(clientId);

Foo est la classe du composant que vous utilisez et clientId est l'ID client du composant dans l '" formId: elementId " format utilisé par JSF.

Pour moi, cela a fonctionné:

@ManagedBean(name = "bean")
@ViewScoped
public class Bean {
    private SelectOneMenu component;

    public SelectOneMenu getComponent() {
        return selectComponent;
    }

    public void setComponent(SelectOneMenu component) {
        this.Component = component;
    }
    public void resetComponent() {
        component.resetValue();
    }
    ...
}
<h:selectOneRadio value="#{bean.value}" id = "idRadio" required="true" requiredMessage = "Required Message" binding="#{bean.component}" >
    <f:selectItem itemLabel="Value 1" itemValue="value1"/>
    <f:selectItem itemLabel="Value 2" itemValue="value2" />     
</h:selectOneRadio>

<primefaces:commandButton action="#{bean.resetComponent}" value="Erase" update="idRadio" immediate="true"/>
...

Merci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top