Les champs de saisie ne conservent les valeurs précédentes que si la validation a échoué
Je suis venu avec un problème étrange. J'ai essayé d'isoler le problème, donc voici mon code simplifié.
public class MyBean {
private List<Data> dataList;
Data selectedData;
public MyBean() {
dataList = new ArrayList<Data>();
dataList.add(new Data("John", 16));
dataList.add(new Data("William", 25));
}
public List<Data> getDataList() {
return dataList;
}
public void edit(Data data) {
selectedData = data;
}
public void newData() {
selectedData = new Data(null, null);
}
public Data getSelectedData() {
return selectedData;
}
public class Data {
String name;
Integer age;
Data(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
}
xhtml:
<rich:modalPanel id="pop">
<h:form>
Name: <h:inputText value="#{myBean.selectedData.name}" required="true" id="txtName"/><br/>
Age : <h:inputText value="#{myBean.selectedData.age}" required="true" id="txtAge"/>
<a4j:commandButton value="Save"/>
<a4j:commandButton value="Close" onclick="Richfaces.hideModalPanel('pop');return false;"/>
<br/>
<rich:message for="txtName"/><br/>
<rich:message for="txtAge"/>
</h:form>
</rich:modalPanel>
<h:form>
<rich:dataTable value="#{myBean.dataList}" var="data">
<rich:column>#{data.name}</rich:column>
<rich:column>
<a4j:commandLink value="Edit" action="#{myBean.edit(data)}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
</rich:column>
</rich:dataTable>
<a4j:commandButton value="New" action="#{myBean.newData()}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
</h:form>
C'est la voie de l'erreur:
- Charger la page
- Cliquez sur le lien "Modifier" dans la première ligne(popup affiche)
- De popup, claire de "l'Âge" et cliquez sur "Enregistrer".(Message affiché)
- Cliquez sur annuler(sans remplissage "Âge")
- Cliquez sur le deuxième lien.
- Maintenant, il montre les données non pertinentes(données précédentes). - C'est le problème
- Même quand je clique sur "Nouveau" bouton, il affiche des données incorrectes.
Cela se produit uniquement si une validation est échoué dans la popup.
Est-il une solution pour cela?
source d'informationauteur prageeth
Vous devez vous connecter pour publier un commentaire.
Ce problème est en JSF 2 aussi reconnu et expliqué en détail dans la réponse suivante: Comment puis-je remplir un champ de texte à l'aide de PrimeFaces AJAX après validation des erreurs se produisent? Si vous avez été en utilisant JSF 2, vous pourriez avoir utilisé OmniFaces'
ResetInputAjaxActionListener
ou PrimeFaces'<p:resetInput>
ouresetValues="true"
pour cela.Au point, vous devez effacer l'état de la
EditableValueHolder
composant lorsqu'il est sur le point d'être ajax-rendus, mais qui n'est pas inclus dans l'ajax d'exécution. Pour effacer l'état, JSF 2, vous auriez utilisé la méthode de convenanceresetValue()
pour cela, mais ce n'est pas disponible dans JSF 1.2 et vous avez besoin d'invoquer les 4 méthodes individuellessetValue(null)
setSubmittedValue(null)
setLocalValueSet(false)
setValid(true)
pour effacer l'état.Pour déterminer quels composants sont à ajax-rendu, mais n'a pas été ajax exécutés, JSF 2, vous auriez utilisé
PartialViewContext
méthodes pour cela, mais ce n'est pas disponible dans JSF 1.2, qui n'a pas normalisé ajax encore. Vous auriez besoin de jouer avec RichFaces spécifiques API ajax afin de comprendre ça. Je ne peux pas dire que du haut de la tête, donc voici un coup d'envoi exemple en supposant que vous connaissez déjà les composants qui doit être effacée. Imaginez que la forme de votre popup aid="popForm"
et le champ de saisie nom aid="nameInput"
voici comment vous pouvez l'effacer à l'intérieur de lanewData()
méthode:faire qu'une seule chose à annuler l'ensemble des mesures tous les popup des valeurs null. maintenant, dans votre prochain clic toutes les valeurs définies par défaut.
ou cliquez sur définir toutes les précédentes valeurs null. et de définir toutes les valeurs respectives par la suite.
J'ai eu le même problème. si vous utilisez Primefaces, la solution est aussi simple que de mettre
resetValues="true"
sur votre p:commandLink ou p:commandButton que les charges de l'élément sélectionné.