Pergunta

eu tenho um página de listagem isso vai para um adicionar Página. A página add tem um Nome TextBox cujo valor está ligado a um Bean com escopo.

A página de listagem tem um Adicionar botão Isso passa por um método de ação para a página Adicionar. Este método de ação limpa o objeto para o qual o nome da caixa de texto está vinculado.

eu tambem tenho um Botão de cancelar Na página Adicionar, que está vinculada a um método de ação que novamente limpa o valor para o qual o nome da caixa de texto está vinculado.

Se nada estiver definido como imediato, tudo funcionará bem.

No entanto, se eu definir o botão Cancelar para imediatamente, se eu inserir valores no campo Nome e clicar em Cancelar, o método de ação será disparado e limpa o objeto no feijão de apoio e vai para a página de listagem. Se eu clicar em Adicionar, o método de ação limpa o objeto novamente (ignore se for o melhor método ou não) e depois vai para a página Adicionar. Agora eu esperaria que a caixa de texto do nome Add Page estivesse vazia, mas não é?! Certamente, como o botão Adicionar não é imediato, os valores devem ser re-limitados e vazios?

Abaixo está o xhtml relevante para o botão Adicionar na página de listagem

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

Abaixo está o xhtml relevante para a caixa de entrada na página Adicionar (MyBean é escopo de sessão), seguido pelo botão Cancelar na página Adicionar.:

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

Solução

Eu quase nunca uso o binding Propriedade das tags, exceto quando eu preciso identificar qual item de uma lista teve uma ação acionada, por isso não estou particularmente bem informado sobre seus usos. Mas eu sei que sem usar binding Seu código provavelmente funcionaria como você esperava, então minha expectativa é que seja o que for javax.faces.component.UIxxx Objeto ao qual você está vinculativo não está sendo redefinido corretamente.

Outras dicas

Estou tendo problemas muito semelhantes agora.

Além de remover o atributo de ligação e/ou imediato, tente Chall SetsubMittValue () no componente com a ligação da ação chamada clique no botão 'Adicionar'.

Infelizmente, mesmo que isso o ajude, você ainda precisaria fazê -lo em qualquer ação que possa levar à exibição do mesmo componente após o cancelamento.

É por isso que ainda estou tentando descobrir uma solução melhor ...

Se você usar imediatamente = "true", o valor será mantido, é assim que o parâmetro funciona. Você deve dar uma olhada nos seguintes links:

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

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

Ok, aqui está um exemplo que eu fiz do zero. Eu tenho dois botões de cancelamento, um que é imediato e que não é. Exemplo de etapas para reproduzir:

  • Vá para a página da lista de James e clique em Adicionar
  • A página Adicionar é exibida com campos vazios. Digite valores para todos os campos e clique em Adicionar.
  • A página de listagem é exibida e é atualizada para incluir a nova pessoa. Clique em Adicionar.
  • A página Adicionar é exibida com campos vazios. Digite valores para todos os campos e clique em Cancelar (imediato)
  • A página de listagem é exibida e permanece inalterada. Clique em Adicionar.
  • A página Adicionar exibe, no entanto, os campos não estão vazios, como eu esperaria. Clique em Cancelar.
  • A página de listagem é exibida e permanece inalterada. Clique em Adicionar.
  • A página Adicionar é exibida e agora os campos não estão vazios.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top