JSF commandButton with immediate ="true"

iva*_*ans 6 jsf

我有一种情况,其中有一个selectOneMenu,其值绑定到支持bean.

我需要一个不更新模型值的按钮(这就是为什么它有immediate ="true"属性).

该按钮的action方法更改selectOneMenu绑定的值,但是当重新显示页面时,将显示原始值(已提交的值)而不是action方法中设置的值.

任何想法为什么会发生这种情况?

如果我没有足够好地解释这个问题,请告诉我.


编辑:这里要求的是有问题的源代码:

页码:

<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>
Run Code Online (Sandbox Code Playgroud)

java代码:

private Person selectedPerson;

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

解决方案是在内衬标记解决方案 :)

iva*_*ans 7

由于在发布此问题后经常发生这种情况,我找到了答案:

这里详细解释了问题的原因:ClearInputComponents

问题是(如所解释的)模型值尚未更新,因此提交的输入仍在component.submittedValue字段中,如果不是空的话,则显示该字段.模型更新后,它通常会被清空.

第一个解决方案在我的情况下不起作用,因为视图中还有其他重要的状态,不能丢失.但第二个解决方案很有效:

component.setSubmittedValue(null);
Run Code Online (Sandbox Code Playgroud)

这就是所需要的:它是一个额外的工作,因为组件必须绑定到某个bean,但不是那么糟糕.