Wpadłem na dziwny problem. Próbowałem wyizolować problem, więc poniżej jest mój uproszczony kod.Pola wejściowe zawierają poprzednie wartości tylko w przypadku niepowodzenia sprawdzania poprawności
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>
To jest ścieżka do błędu:
- załadować stronę
- Kliknij link "Edytuj" w pierwszym rzędzie (wyświetla popup)
- W wyskakującym okienku wyczyść pole "Wiek" i kliknij "Zapisz". (Wymagane wyświetlony komunikat)
- Anuluj kliknięcie (bez wypełniania pola "Wiek")
- Kliknij drugi link.
- Teraz pokazuje nieistotne dane (poprzednie dane). - To jest problem
- Nawet po kliknięciu przycisku "Nowy" wyświetla niepoprawne dane.
Dzieje się tak tylko wtedy, gdy sprawdzanie poprawności nie powiedzie się w popupie.
Czy istnieje rozwiązanie tego problemu?
Wiem, że to nie pomoże ci zrozumieć problemu, ale nie powinieneś ufać kontrolerowi (stronie serwera), aby wyczyścić wartości w widoku (stronie JSF), gdy można to zrobić za pomocą zwykłego kodu JavaScript (odnosi się to wyłącznie do nowego ''). –
Dziękujemy za sugestie dotyczące używania javascript. Spróbuję i poinformuję cię, gdy tylko znajdę czas. – prageeth
@ LuiggiMendoza: Użyłem javascript i odniosłem pewien sukces. Ale moja ** prawdziwa ** sytuacja jest trochę skomplikowana i nie mogłem użyć javascript dla mojej obecnej ** prawdziwej sytuacji **. Jednak bardzo dziękuję za podpowiedź i mam nadzieję, że dodam obejście javascript jako odpowiedź na to pytanie dla innych ludzi, kiedy mam czas. :) – prageeth