wake-up-neo.com

Eingabefelder enthalten vorherige Werte nur, wenn die Validierung fehlgeschlagen ist

Ich hatte ein merkwürdiges Problem. Ich habe versucht, das Problem einzugrenzen. Das Folgende ist mein vereinfachter Code.

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>

Dies ist der Pfad zum Fehler:

  1. Laden Sie die Seite
  2. Klicken Sie auf den Link "Bearbeiten" in der ersten Zeile (Popup-Anzeigen)
  3. Deaktivieren Sie im Popup-Fenster das Feld "Alter" und klicken Sie auf "Speichern". (Erforderliche Nachricht angezeigt)
  4. Klicken Sie auf Abbrechen (ohne das Feld "Alter" auszufüllen)
  5. Klicken Sie auf den zweiten Link.
  6. Jetzt werden irrelevante Daten angezeigt (vorherige Daten). - Das ist das Problem
  7. Selbst wenn ich auf "Neu" klicke, werden falsche Daten angezeigt.

Dies geschieht nur, wenn eine Überprüfung im Popup fehlgeschlagen ist.
Gibt es dafür eine Lösung?

12
prageeth

Dieses Problem wird in JSF 2 auch in der folgenden Antwort erkannt und ausführlich erläutert: Wie kann ich ein Textfeld mit PrimeFaces AJAX füllen, nachdem Überprüfungsfehler aufgetreten sind? Wenn Sie JSF 2 verwendet haben, könnten Sie dafür OmniFaces ' ResetInputAjaxActionListener oder PrimeFaces' <p:resetInput> ODER resetValues="true" verwenden.

Bis zu dem Punkt müssen Sie den Status der EditableValueHolder -Komponente löschen, wenn es darum geht, ajax-gerendert zu werden, was jedoch nicht in ajax-execute enthalten ist. Um den Status zu löschen, hätten Sie in JSF 2 die Komfortmethode resetValue() verwendet, diese steht jedoch in JSF 1.2 nicht zur Verfügung, und Sie müssen zum Löschen die vier einzelnen Methoden setValue(null), setSubmittedValue(null), setLocalValueSet(false), setValid(true) aufrufen der Staat.

Um herauszufinden, welche Komponenten ajax-gerendert werden sollen, aber nicht ajax-ausgeführt wurden, hätten Sie in JSF 2 PartialViewContext-Methoden verwendet, aber diese sind in JSF 1.2 noch nicht verfügbar, das Ajax noch nicht standardisiert hat. Sie müssten mit der RichFaces-spezifischen Ajax-API experimentieren, um das herauszufinden. Ich kann das nicht aus der Vogelperspektive beurteilen, daher hier ein Kickoff-Beispiel, vorausgesetzt, Sie kennen bereits die Komponenten, die gelöscht werden müssen. Stellen Sie sich vor, das Formular in Ihrem Popup hat id="popForm" und das Namenseingabefeld hat id="nameInput". So können Sie es in der Methode newData() löschen:

UIInput nameInput = (UIInput) context.getViewRoot().findComponent("popForm:nameInput");
nameInput.setValue(null);
nameInput.setSubmittedValue(null);
nameInput.setLocalValueSet(false);
nameInput.setValid(true);
31
BalusC

führen Sie beim Abbrechen eine Aktion aus, und setzen Sie alle Popup-Werte auf Null. Klicken Sie jetzt bei Ihrem nächsten Klick auf alle Werte, die als Standard festgelegt wurden.

oder setzen Sie bei Klick alle vorherigen Werte auf null. und stellen Sie danach alle entsprechenden Werte ein.

1
durgesh6121

Ich hatte das gleiche problem Wenn Sie Primefaces verwenden, können Sie einfach resetValues="true" in Ihren p: commandLink oder p: commandButton einfügen, der das ausgewählte Element lädt.

1
hendinas