Domanda

ho un pagina Inserzione che va a una pagina Aggiungi . La pagina di add ha un textbox nome il cui valore è destinato a fagiolo un con scope di sessione .

La pagina di elenco ha un pulsante di Aggiungi che va attraverso un metodo di azione alla pagina di add. Questo metodo di azione cancella l'oggetto che il nome di testo è associato.

Ho anche un pulsante Annulla nella pagina add, che è destinato a un metodo di azione che cancella di nuovo il valore che il nome di testo è associato.

Se non è impostato immediato, tutto questo funziona bene.

Tuttavia, se ho impostato il pulsante di annullamento per immediato, se entro i valori nel campo del nome, e quindi fare clic su Annulla, il metodo di azione viene licenziato e cancella l'oggetto nel backing bean e va alla pagina dell'elenco. Se poi clicco aggiungere, il metodo di azione cancella l'oggetto nuovo (ignora se è il metodo migliore o meno) e poi va alla pagina add. Vorrei ora aspetto che il nome di testo della pagina metti in essere vuoto, ma non è ?! Sicuramente, dal momento che il pulsante Aggiungi non è immediata, i valori dovrebbero essere ri-bound e vuoto?

Di seguito è riportato l'XHTML rilevante per il pulsante Aggiungi alla pagina dell'elenco

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

Di seguito è riportato l'XHTML rilevante per la casella di input nella pagina add (MyBean è con scope di sessione), seguita da quella del pulsante di annullamento sulla pagina add:.

<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?');"/>
È stato utile?

Soluzione

ho quasi mai utilizzare la proprietà binding di tag, ad eccezione di quando ho bisogno di identificare quale elemento di una lista ha avuto un'azione sparato su di esso, quindi non sono particolarmente ben informato sui suoi usi. Ma so che senza usare binding il codice sarebbe molto probabile che funzioni come previsto, quindi la mia aspettativa è che qualsiasi oggetto javax.faces.component.UIxxx si sono vincolanti per non sta ottenendo ripristinato correttamente.

Altri suggerimenti

sto avendo problemi molto simili in questo momento.

Oltre a rimuovere l'attributo di rilegatura e / o immediato, prova a chiamare setSubmittedValue () sul componente con il legame di azione chiamato clic sul pulsante 'Aggiungi'.

Purtroppo, anche se ti aiuta, si dovrebbe ancora farlo in qualsiasi azione che può portare alla visualizzazione stessa componente dopo annullare l'operazione.

È per questo che sto ancora cercando di capire qualche soluzione migliore ...

Se si utilizza immediata = "true", allora il valore sarà mantenuto, questo è come funziona il parametro. Si dovrebbe dare un'occhiata ai seguenti link:

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

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

Ok, ecco un esempio che ho fatto da zero. Ho due pulsanti Annulla, uno che è immediato, e uno che non lo è. Esempio di passaggi per riprodurre:

  • Vai alla pagina james-list e fare clic su Aggiungi
  • Viene visualizzata la pagina add con i campi vuoti. Immettere i valori per tutti i campi e fare clic su Aggiungi.
  • Viene visualizzata la pagina di quotazione ed è aggiornato per includere la nuova persona. Fare clic su Aggiungi.
  • Viene visualizzata la pagina add con i campi vuoti. Immettere i valori per tutti i campi e fare clic su Annulla (immediata)
  • Viene visualizzata la pagina di quotazione ed è invariato. Fare clic su Aggiungi.
  • Viene visualizzata la pagina add tuttavia i campi non sono vuoti come mi sarei aspettato. Fare clic su Annulla.
  • Viene visualizzata la pagina di quotazione ed è invariato. Fare clic su Aggiungi.
  • Viene visualizzata la pagina add e ora i campi non sono vuoti.

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top