Pregunta

tengo un página de listado eso va a un añadir página.La página de agregar tiene un cuadro de texto del nombre cuyo valor está ligado a un frijol con ámbito de sesión.

La página de listado tiene un botón agregar que va a través de un método de acción a la página de agregar.Este método de acción borra el objeto al que está vinculado el cuadro de texto del nombre.

También tengo un botón cancelar en la página de agregar, que está vinculada a un método de acción que nuevamente borra el valor al que está vinculado el cuadro de texto del nombre.

Si nada está configurado como inmediato, todo funciona bien.

Sin embargo, si configuro el botón cancelar en inmediato, si ingreso valores en el campo de nombre y luego hago clic en cancelar, el método de acción se activa, borra el objeto en el bean de respaldo y va a la página de listado.Si luego hago clic en Agregar, el método de acción borra el objeto nuevamente (ignora si es el mejor método o no) y luego va a la página Agregar.Ahora esperaría que el cuadro de texto del nombre de la página para agregar estuviera vacío, ¡¿pero no lo está ?!Seguramente, dado que el botón Agregar no es inmediato, ¿los valores deberían estar reencuadernados y vacíos?

A continuación se muestra el XHTML relevante para el botón Agregar en la página de listado

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

A continuación se muestra el XHTML relevante para el cuadro de entrada en la página de agregar (myBean tiene un ámbito de sesión), seguido por el del botón cancelar en la página de agregar:

<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?');"/>
¿Fue útil?

Solución

Casi nunca utilizar la propiedad binding de etiquetas, a excepción de cuando necesito para identificar qué elemento de una lista que ha tenido una acción disparó sobre él, así que no estoy particularmente bien informados acerca de sus usos. Pero sé que sin utilizar binding su código lo más probable es el trabajo como se esperaba, por lo que mi expectativa es que cualquiera que sea objeto javax.faces.component.UIxxx desee realizar la vinculación no está recibiendo reajuste correctamente.

Otros consejos

Estoy teniendo problemas muy similares en este momento.

Además de eliminar el atributo de unión y / o inmediata, intente llamar setSubmittedValue () en el componente con la unión de la acción exhortó clic en el botón 'añadir'.

Por desgracia, incluso si le ayuda, que todavía tendría que hacerlo en cualquier acción que puede conducir a la visualización de un mismo componente después de cancelar.

Es por eso que todavía estoy tratando de averiguar alguna solución mejor ...

Si utiliza = inmediatos se mantendrá "verdadero", entonces el valor, esto es como trabajan los parámetros. Usted debe echar un vistazo a los siguientes enlaces:

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

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

Ok, aquí hay un ejemplo que hice desde cero. Tengo dos se anulan los botones, uno que es inmediato, y uno que no lo es. Ejemplo de pasos para reproducir:

  • Ir a la página de James-lista y haga clic en Agregar
  • la página Agregar pantallas con campos vacíos. Introduzca los valores para todos los campos y haga clic en Añadir.
  • Las pantallas y Page lista se actualiza para incluir la nueva persona. Haga clic en Agregar.
  • la página Agregar pantallas con campos vacíos. Introduzca los valores de todos los campos y haga clic en Cancelar (inmediata)
  • Las indicaciones de la página del anuncio y no se ha modificado. Haga clic en Agregar.
  • Aparecerá la página de complementos sin embargo, los campos no están vacías lo que cabe esperar. Haga clic en Cancelar.
  • Las indicaciones de la página del anuncio y no se ha modificado. Haga clic en Agregar.
  • la página Agregar pantallas y ahora los campos no están vacías.

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top