Frage

Ich habe eine Situation, wo es eine selectOneMenu ist, die einen Wert auf eine Backing Bean gebunden hat.

Ich brauche eine Schaltfläche haben, die nicht Modellwert nicht aktualisiert (das ist, warum es immediate = „true“ Eigenschaft hat).

, die Aktion-Methode der Schaltfläche ändert den Wert der selectOneMenu gebunden wird, aber wenn die Seite der ursprüngliche Wert wieder angezeigt wird, wird angezeigt (die, die eingereicht wurde) und nicht den einen Satz in der Aktionsmethode.

Irgendwelche Ideen, warum das passiert?

Wenn ich das Problem nicht gut genug, um erklären habe lass es mich wissen.


BEARBEITEN: Wie hier angefordert ist der Quellcode in Frage:

Seite Code:

<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-Code:

private Person selectedPerson;

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

Die Lösung ist in den ausgekleideten gekennzeichnet SOLUTION :)

War es hilfreich?

Lösung

Wie es passiert häufig ein paar Augenblicke, nachdem diese Frage Entsendung Ich habe eine Antwort gefunden:

Die Ursache des Problems im Detail erklärt hier: ClearInputComponents

Das Problem ist (wie beschrieben), dass die Modellwerte nicht aktualisiert wurden, so die eingereichten Eingaben noch in component.submittedValue Feld und das Feld wird angezeigt, wenn nicht leer. Es wird geleert normalerweise nach Modell aktualisiert wurde.

Die erste Lösung nicht in meinem Fall arbeiten, weil es in der Ansicht anderer wichtiger Zustand ist, die nicht verloren gehen dürfen. Aber die zweite Lösung hat super funktioniert:

component.setSubmittedValue(null);

Und das war alles, was man braucht. Es ist eine wenig zusätzliche Arbeit, weil Komponenten zu einem gewissen Bean gebunden sein muss, aber nicht so schlimm

Andere Tipps

Um ein wenig zu verfolgen, ich glaube nicht, dass Sie die Komponente zu einer Bean binden müssen. Sie können nur die Komponente aus der FacesContext Instanz über die UIViewRoot greifen, wenn Sie die Komponente Client-ID kennen.

Es wäre ein bisschen etwas so aus:

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

Wo Foo die Klasse der Komponente Sie verwenden, und clientId ist die Client-ID der Komponente in dem „formid: elementId“. Format, das JSF verwendet

Für mich hat dies funktioniert:

@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"/>
...

Danke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top