JSF bouton de commande avec immediate=“true”
J'ai une situation où il y a un selectOneMenu qui a une valeur liée à un backing bean.
J'ai besoin d'avoir un bouton qui n'a pas de modèle de mise à jour des valeurs (c'est pourquoi il a immediate="true" propriété).
Que le bouton d'action de la méthode change la valeur de la selectOneMenu est lié, mais quand la page se réaffiche la valeur d'origine est affichée (celui qui a été soumis) et non pas celui qui est défini dans la méthode d'action.
Des idées pourquoi ce qui se passe?
Si je n'ai pas expliquer le problème assez bon, s'il vous plaît laissez-moi savoir.
EDIT:
Comme demandé voici le code source en question:
code de la 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>
de code java:
private Person selectedPerson;
public String createNew() {
log.debug("New created...");
selectedPerson = null;
bindings.getSelectPersonComponent().setSubmittedValue(null); //SOLUTION
return "";
}
La solution est dans la ligné marqué la SOLUTION 🙂
- Vous pouvez poster votre JSF et de haricots code s'il vous plaît?
Vous devez vous connecter pour publier un commentaire.
Comme il arrive parfois, quelques instants après la publication de cette question, j'ai trouvé une réponse:
La cause du problème est expliqué en détail ici: ClearInputComponents
Le problème est (comme expliqué) que le modèle de valeurs n'ont pas été mises à jour afin que le soumis entrées sont toujours dans le composant.submittedValue champ et que le champ est affiché si ce n'est pas vide. Il est vidé normalement d'après modèle a été mis à jour.
La première solution ne fonctionne pas dans mon cas car il y a d'autres importants de l'etat dans le point de vue qui ne doit pas se perdre. Mais la deuxième solution a très bien fonctionné:
Et c'était tout ce qui était nécessaire: il est un peu plus de travail parce que les composants doivent être liés à certains bean, mais pas si mauvais que ça.
De suivre un peu, je ne pense pas que vous avez besoin de lier le composant à un haricot. Il vous suffit de prendre le composant à partir de la
FacesContext
exemple par le biais de laUIViewRoot
, si vous connaissez le composant de l'IDENTIFIANT client.Il serait aller un peu à quelque chose comme ceci:
Où
Foo
est la classe du composant que vous utilisez etclientId
est l'ID du client de la composante dans le "formId:elementId" format JSF utilise.Pour moi, cela a fonctionné:
Grâce.