Frage

Ich habe eine Auflistung Seite , die eine geht Add-Seite . Die Add-Seite hat ein Name Textbox , dessen Wert gebunden ein Sitzung scoped Bohne .

Die Auflistung enthält eine Add-Taste , die über eine Aktion-Methode auf die Add-Seite geht. Diese Aktion Methode löscht das Objekt, dass der Name Textbox ist verpflichtet.

Ich habe auch eine Abbruchtaste auf der Add-Seite, die auf eine Aktion Verfahren gebunden ist, wieder, dass der Wert löscht, dass der Name Textfeld gebunden ist.

Wenn nichts sofort gesetzt ist, dies alles funktioniert gut.

Wenn ich aber stellen Sie die Taste, um sofort abzubrechen, wenn ich Werte in dem Namensfeld eingeben, und klicken Sie dann auf Abbrechen, wird die Aktion Methode gebrannt und löscht das Objekt in der Backing Bean und geht zum Auflisten Seite. Wenn ich dann auf Hinzufügen klicken, löscht die Aktion-Methode das Objekt erneut (ignorieren, wenn es beste Methode ist oder nicht), und geht dann auf der Seite hinzufügen. Ich würde erwarten, jetzt den Namen Textbox add Seite leer sein, aber es ist nicht wahr ?! Sicherlich, da die Schaltfläche Hinzufügen nicht unmittelbar ist, sollten die Werte wieder gebunden und leer sein?

Im Folgenden finden Sie die entsprechende XHTML für die Add-Taste auf der Anzeige Seite

<h:commandButton id="addButton"
                 value="Add"
                 action="#{myBean.gotoAdd}"/>

Im Folgenden finden Sie die entsprechende XHTML für das Eingabefeld auf der Add-Seite (MyBean ist Sitzung scoped), gefolgt von den von der Löschtaste auf der Seite hinzufügen.

<h:inputText id="newName"
             value="#{myBean.newObject.name}"
             binding="#{myBean.newNameInput}"
             styleClass="name" />

<h:commandButton id="cancelButton"
                 value="Cancel" immediate="true"
                 action="#{myBean.cancelAdd}"
                 onclick="return confirm('You sure?');"/>
War es hilfreich?

Lösung

Ich benutze fast nie die binding Eigenschaft von Tags, außer wenn ich erkennen müssen, welches Element einer Liste eine Aktion auf sie gefeuert hatte, also bin ich nicht besonders gut informiert über seine Verwendungen. Aber ich weiß, dass ohne binding mit Ihrem Code würde höchstwahrscheinliche Arbeit wie erwartet, so meine Erwartung, dass ist was javax.faces.component.UIxxx Objekt, das Sie binden nicht zurückgesetzt richtig zu bekommen.

Andere Tipps

Ich habe sehr ähnliche Probleme jetzt.

Neben der Bindung und / oder sofort Attribut zu entfernen, versuchen setSubmittedValue () aufrufen, auf die Komponente mit der Bindung von Aktion aufgerufen, klicken Sie auf ‚Hinzufügen‘ klicken.

Ach, auch wenn es hilft Ihnen, würden Sie noch in irgendeiner Aktion zu tun haben, die gleiche Komponente zur Anzeige nach Abbrechen führen kann.

Das ist, warum ich versuche immer noch herauszufinden, einige bessere Lösung ...

Wenn Sie sofort = „true“ verwenden, dann wird der Wert gehalten werden, so lassen sich die Parameter funktioniert. Sie sollten einen Blick auf die folgenden Links bringen:

http://wiki.apache.org/myfaces/How_The_Immediate_Attribute_Works

http://wiki.apache.org/myfaces/ClearInputComponents

Ok, hier ist ein Beispiel, dass ich von Grund auf neu gemacht haben. Ich habe zwei Tasten abbrechen, eine, die unmittelbar ist, und eine, die nicht ist. Beispiel für Schritte zu reproduzieren:

  • Gehen Sie zu james-Liste-Seite und klicken Sie auf Hinzufügen
  • Die Add-Seite zeigt mit leeren Feldern. Geben Sie Werte für alle Felder aus und klicken Sie auf Hinzufügen.
  • Die Auflistung Seite angezeigt und aktualisiert, um die neue Person aufzunehmen. Klicken Sie auf Hinzufügen.
  • Die Add-Seite zeigt mit leeren Feldern. Geben Sie Werte für alle Felder und klicken Sie auf Abbrechen (Immediate)
  • Die Auflistung Seite angezeigt und ist unverändert. Klicken Sie auf Hinzufügen.
  • Die Add-Seite zeigt jedoch die Felder nicht leer sind, wie ich erwarten würde. Klicken Sie auf Abbrechen.
  • Die Auflistung Seite angezeigt und ist unverändert. Klicken Sie auf Hinzufügen.
  • Die Add-Seite angezeigt und jetzt die Felder nicht leer sind.

James.java:

package com.jamiebarrow;

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;

@ManagedBean
@SessionScoped
public class James {

  private UIComponent idComponent;
  private UIComponent firstNameComponent;
  private UIComponent lastNameComponent;

  public UIComponent getIdComponent() {
    return idComponent;
  }

  public void setIdComponent(UIComponent idComponent) {
    this.idComponent = idComponent;
  }

  public UIComponent getFirstNameComponent() {
    return firstNameComponent;
  }

  public void setFirstNameComponent(UIComponent firstNameComponent) {
    this.firstNameComponent = firstNameComponent;
  }

  public UIComponent getLastNameComponent() {
    return lastNameComponent;
  }

  public void setLastNameComponent(UIComponent lastNameComponent) {
    this.lastNameComponent = lastNameComponent;
  }

  private List<Person> personResults;

  private Person person;

  public James() {
    personResults = new ArrayList();
    personResults.add(new PersonBuilder(1, "Bob", "Uncle").build());
    personResults.add(new PersonBuilder(2, "Jack", "Black").build());
  }

  public List<Person> getPersonResults() {
    return personResults;
  }

  public void setPersonResults(List<Person> personResults) {
    this.personResults = personResults;
  }

  public Person getPerson() {
    return person;
  }

  public void setPerson(Person person) {
    this.person = person;
  }

  private void clearPerson() {
    person = new PersonBuilder().build();
  }

  public String gotoList() {
    return "james-list";
  }

  public String gotoAdd() {
    clearPerson();
    return "james-add";
  }

  public String cancelAdd() {
    clearPerson();
    return gotoList();
  }

  public String addPerson() {
    personResults.add(person);
    return gotoList();
  }
}

james-list.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head>
  <title>list page</title>
</h:head>

<body>
<div class="container">
  <div class="content">
    <h:messages showSummary="true" showDetail="false" errorClass="error" infoClass="info"
                warnClass="warn"/>
    <h:form>
      <h:dataTable value="#{james.personResults}" var="person">
        <h:column>
          <f:facet name="header">Id</f:facet>
          <h:outputText value="#{person.id}"/>
        </h:column>
        <h:column>
          <f:facet name="header">Name</f:facet>
          <h:outputText value="#{person.firstName}"/>
        </h:column>
        <h:column>
          <f:facet name="header">Surname</f:facet>
          <h:outputText value="#{person.lastName}"/>
        </h:column>
      </h:dataTable>
      <h:panelGroup layout="block">
        <h:commandButton value="Add" action="#{james.gotoAdd}"/>
      </h:panelGroup>
    </h:form>
  </div>
</div>
<ui:debug hotkey="L" rendered="true"/>
</body>
</html>

james-add.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head>
  <title>add page</title>
</h:head>

<body>
<div class="container">
  <div class="content">
    <h:messages showSummary="true" showDetail="false" errorClass="error" infoClass="info"
                warnClass="warn"/>
    <h:form>
      <fieldset>
        <legend>Add Person</legend>
        <h:panelGrid columns="2">
          <h:outputLabel for="PersonId" value="Id:"/>
          <h:inputText id="PersonId" value="#{james.person.id}" binding="#{james.idComponent}"/>
          <h:outputLabel for="PersonFirstName" value="First Name:"/>
          <h:inputText id="PersonFirstName" value="#{james.person.firstName}" binding="#{james.firstNameComponent}"/>
          <h:outputLabel for="PersonLastName" value="Last Name:"/>
          <h:inputText id="PersonLastName" value="#{james.person.lastName}" binding="#{james.lastNameComponent}"/>
        </h:panelGrid>
        <h:panelGroup layout="block">
          <h:commandButton value="Add" action="#{james.addPerson}"/>
          <h:commandButton value="Cancel (immediate)" action="#{james.cancelAdd}" immediate="true"/>
          <h:commandButton value="Cancel" action="#{james.cancelAdd}"/>
        </h:panelGroup>
      </fieldset>
    </h:form>
  </div>
</div>
<ui:debug hotkey="L" rendered="true"/>
</body>
</html>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top