문제

뒷면 콩에 바인딩 된 값이있는 SelectOneMenu가있는 상황이 있습니다.

모델 값을 업데이트하지 않는 버튼이 있어야합니다 (따라서 즉시 = "true"속성이있는 이유).

해당 버튼의 동작 메소드는 SelectOneMenu가 바인딩되는 값을 변경하지만 페이지가 다시 재생되면 원래 값이 표시되고 (제출 된 값)는 작업 메소드에서 설정 한 것이 아닙니다.

왜 그런 일이 일어나고 있는지 아이디어가 있습니까?

문제를 충분히 설명하지 않았다면 알려주십시오.


편집 : 여기에 요청 된대로 문제의 소스 코드가 있습니다.

페이지 코드 :

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

자바 코드 :

private Person selectedPerson;

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

솔루션은 줄 지어 표시되어 있습니다 해결책 :)

도움이 되었습니까?

해결책

이 질문을 게시 한 후 잠시 자주 발생하므로 답을 찾았습니다.

문제의 원인은 여기에 자세히 설명되어 있습니다. ClearInputComponents

문제는 (설명 된대로) 모델 값이 업데이트되지 않았으므로 제출 된 입력이 여전히 구성 요소에 있습니다. SubmittedValue 필드 및 해당 필드가 비어 있지 않으면 표시됩니다. 모델이 업데이트 된 후 정상적으로 비워집니다.

첫 번째 솔루션은 제 경우에는 작동하지 않았습니다. 그러나 두 번째 해결책은 훌륭하게 작동했습니다.

component.setSubmittedValue(null);

그리고 그게 전부였습니다. 구성 요소가 콩에 묶여 있어야하지만 그렇게 나쁘지 않기 때문에 약간의 추가 작업입니다.

다른 팁

후속 조치를 취하기 위해, 나는 당신이 구성 요소를 콩에 바인딩 할 필요가 없다고 생각합니다. 당신은 단지 구성 요소를 잡을 수 있습니다 FacesContext 인스턴스를 통한 인스턴스 UIViewRoot, 구성 요소의 클라이언트 ID를 알고 있다면

그것은 다음과 같이 조금 갈 것입니다.

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

어디에 Foo 사용중인 구성 요소의 클래스이며 clientId JSF가 사용하는 "Cormid : ElementID"형식의 구성 요소의 클라이언트 ID입니다.

저에게는 이것이 효과가있었습니다.

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

감사.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top