Pergunta

Eu tenho uma situação onde há uma selectOneMenu que tem um valor vinculado a um bean de apoio.

Eu preciso ter um botão que não valores atualização modelo (que é por isso que tem = imediatos "verdadeiro" de propriedade).

método de ação que do botão muda o valor do selectOneMenu é obrigado a, mas quando a página é exibida novamente o valor original é exibido (a que foi submetido) e não a um conjunto no método de ação.

Todas as ideias por que está acontecendo?

Se eu não explicar o problema bom o suficiente por favor me avise.


EDITAR: Conforme solicitado aqui é o código-fonte em questão:

código da página:

<h:selectOneMenu id="selectedPerson" 
                 binding="#{bindings.selectPersonComponent}" 
                 value="#{bean.selectedPerson}">
   <s:selectItems var="op" value="#{bean.allPersons}" 
                  label="#{op.osoba.ime} #{op.osoba.prezime}" 
                  noSelectionLabel="#{messages.selectAPerson}">
   </s:selectItems>
   <f:converter converterId="unmanagedEntityConverter" />
</h:selectOneMenu>
...
<a4j:commandButton action="#{bean.createNew}" value="#{messages.createNew}"
     immediate="true" reRender="panelImovine">
</a4j:commandButton>

java código:

private Person selectedPerson;

public String createNew() {
    log.debug("New created...");
    selectedPerson = null;
    bindings.getSelectPersonComponent().setSubmittedValue(null); //SOLUTION
    return "";
}

A solução está no marcado SOLUÇÃO alinhada :)

Foi útil?

Solução

Como acontece frequentemente alguns momentos depois de postar esta pergunta eu encontrei uma resposta:

A causa do problema é detalhadamente explicado aqui: ClearInputComponents

O problema é (como explicado) que os valores do modelo não foram atualizado para as entradas apresentadas ainda estão no campo component.submittedValue e esse campo é exibido se não esvaziar. esvaziou-se normalmente após modelo foi atualizado.

A primeira solução não funcionou no meu caso, porque não há outro estado importante na visão de que não deve se perder. Mas a segunda solução funcionou muito bem:

component.setSubmittedValue(null);

E isso era tudo o que era necessário:. É um pouco de trabalho extra, porque os componentes devem estar vinculados a algum feijão, mas não tão ruim

Outras dicas

Para acompanhar um pouco, eu não acho que você precisa vincular o componente para uma de feijão. Você pode simplesmente pegar o componente da instância FacesContext através da UIViewRoot, se você sabe ID de cliente do componente.

Seria ir um pouco algo como isto:

Foo component = (Foo)FacesContext.getCurrentInstance().getViewRoot().getComponent(clientId);

Onde Foo é a classe do componente que estiver usando e clientId é o ID do cliente do componente no "formId: elementId". Formato que utiliza JSF

Para mim, isso tem funcionado:

@ManagedBean(name = "bean")
@ViewScoped
public class Bean {
    private SelectOneMenu component;

    public SelectOneMenu getComponent() {
        return selectComponent;
    }

    public void setComponent(SelectOneMenu component) {
        this.Component = component;
    }
    public void resetComponent() {
        component.resetValue();
    }
    ...
}
<h:selectOneRadio value="#{bean.value}" id = "idRadio" required="true" requiredMessage = "Required Message" binding="#{bean.component}" >
    <f:selectItem itemLabel="Value 1" itemValue="value1"/>
    <f:selectItem itemLabel="Value 2" itemValue="value2" />     
</h:selectOneRadio>

<primefaces:commandButton action="#{bean.resetComponent}" value="Erase" update="idRadio" immediate="true"/>
...

Graças.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top