Question

J'ai page de liste qui va à une ajouter la page . La page add a une zone de texte Nom dont la valeur est liée à une Session SCOPED haricots .

La page d'inscription a un bouton ajouter qui passe par une méthode d'action à la page d'ajout. Cette méthode d'action efface l'objet que la zone de texte de nom est lié.

J'ai aussi un bouton d'annulation sur la page d'ajout, qui est lié à une méthode d'action qui efface à nouveau la valeur que la zone de texte Nom est lié.

Si rien n'est à immédiat, tout cela fonctionne très bien.

Cependant, si je mets le bouton d'annulation à immédiatement, si j'entrer des valeurs dans le champ Nom, puis cliquez sur Annuler, la méthode d'action est déclenché et efface l'objet dans la fève de support et se dirige vers la page d'inscription. Si je puis cliquez sur ajouter, la méthode d'action efface à nouveau l'objet (ignorer si elle est meilleure méthode ou non), puis passe à la page d'ajout. J'attends maintenant la zone de texte Nom de la page Ajouter à être vide, mais ce n'est pas ?! Sûrement, puisque le bouton Ajouter n'est pas immédiat, les valeurs doivent être re-liés et vide?

Voici le XHTML pertinent pour le bouton Ajouter sur la page d'inscription

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

Voici le XHTML pertinent pour la zone de saisie sur la page d'ajout (monBean est la session scope), suivie par celle du bouton d'annulation sur la page d'ajout:.

<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?');"/>
Était-ce utile?

La solution

J'utilise presque jamais la propriété binding des balises, sauf quand je dois identifier quel élément d'une liste a eu une action tiré sur elle, donc je ne suis pas particulièrement bien informé au sujet de ses utilisations. Mais je sais que sans utiliser binding votre code serait plus probable des travaux comme prévu, donc mes attentes est que quel que soit l'objet javax.faces.component.UIxxx vous liez ne reçoit pas réinitialiser correctement.

Autres conseils

Je vais avoir des problèmes très similaires en ce moment.

En plus de supprimer l'attribut de liaison et / ou immédiat, essayez d'appeler setSubmittedValue () sur le composant à la liaison de l'action fait appel à un clic sur le bouton « ajouter ».

Hélas, même si elle vous aide, vous auriez encore de le faire dans toute action qui peut conduire à l'affichage même composant après annulation.

Voilà pourquoi je suis encore à essayer de trouver une meilleure solution ...

Si vous utilisez immédiatement = « true » la valeur sera conservée, voici comment fonctionne le paramètre. Vous devriez jeter un oeil sur les liens suivants:

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

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

Ok, voici un exemple que je l'ai fait à partir de zéro. J'ai deux boutons cancel, qui est immédiat, et qui ne sont pas. Exemple d'étapes pour reproduire:

  • Aller à la page james-liste et cliquez sur Ajouter
  • La page d'ajout affiche avec des champs vides. Entrez les valeurs pour tous les champs et cliquez sur Ajouter.
  • La page affiche la liste et est mis à jour pour inclure la nouvelle personne. Cliquez sur Ajouter.
  • La page d'ajout affiche avec des champs vides. Entrez les valeurs pour tous les champs et cliquez sur Annuler (immédiat)
  • La page affiche la liste et ne change pas. Cliquez sur Ajouter.
  • La page add affiche cependant les champs ne sont pas vides comme je l'attendre. Cliquez sur Annuler.
  • La page affiche la liste et ne change pas. Cliquez sur Ajouter.
  • L'écran Ajouter une page et maintenant les champs ne sont pas vides.

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top