我遇到的情况是selectOneMenu的值绑定到支持bean。
我需要一个不更新模型值的按钮(这就是为什么它具有immediate =“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 "";
}
解决方案位于标有解决方案的内衬:)
答案 0 :(得分:7)
由于在发布此问题后经常发生这种情况,我找到了答案:
此处详细解释了问题的原因:ClearInputComponents
问题是(如所解释的)模型值尚未更新,因此提交的输入仍在component.submittedValue字段中,如果不是空的话,则显示该字段。模型更新后,它通常会被清空。
第一个解决方案在我的情况下不起作用,因为视图中还有其他重要状态不会丢失。但第二种解决方案效果很好:
component.setSubmittedValue(null);
这就是所需要的:这是一个额外的工作,因为组件必须绑定到某个bean,但不是那么糟糕。
答案 1 :(得分:1)
为了跟进,我认为你不需要将组件绑定到bean。如果您知道组件的客户端ID,则可以通过FacesContext
从UIViewRoot
实例获取组件。
这会有点像这样:
Foo component = (Foo)FacesContext.getCurrentInstance().getViewRoot().getComponent(clientId);
其中Foo
是您正在使用的组件的类,clientId
是JSF使用的“formId:elementId”格式的组件的客户端ID。
答案 2 :(得分:0)
对我而言,这有效:
@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"/>
...
感谢。