문제
뒷면 콩에 바인딩 된 값이있는 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"/>
...
감사.