<h:selectOneMenu id="selectOneMenu" value="#{Bean1.val1}" >
<f:selectItems value="#{Bean1.selectItems}"/>
<a4j:support event="onchange" action="#{Bean1.onSelectOneMenuChange}" reRender="textbox1 , textbox2 , textbox3, textbox4" />
</h:selectOneMenu>
<h:inputText id="textbox1" value="#{Bean1.textbox1}"> </h:inputText>
<h:inputText id="textbox2" value="#{Bean1.textbox2}"> </h:inputText>
<h:inputText id="textbox3" value="#{Bean1.textbox3}"> </h:inputText>
<h:inputText id="textbox4" value="#{Bean1.textbox4}"> </h:inputText>
Bean1.onSelectOneMenuChange()
会更改Bean1.textbox1
,Bean1.textbox2
,Bean1.textbox3
和Bean1.textbox4
的值(取决于所选的值(Bean1.val1)
)。有时,它会更改所有文本框值,有时它只会更改一些文本框值。
当用户更改“selectOneMenu”下拉列表控件中的值时,JSF框架不会调用更新模型值阶段,而是直接调用Bean1.onSelectOneMenuChange()
。之后,所有文本框都是reRender。由于未调用更新模型值阶段,因此用户输入的值永远不会设置为Bean1,原始值将显示在reRender
之后的文本框中。
我想问:
如何在Bean1.onSelectOneMenuChange()
内手动调用更新模型值阶段?如何从Bean1.onSelectOneMenuChange()
中的用户获取值输入并将其设置为Bean1
的相应字段?
另一种方法是只有reRender那些在Bean1.onSelectOneMenuChange()内更新其值的文本框。但是,有很多情况。例如,值会更改所有文本框值,而值只能更改某些文本框值。我可以如何有条件地reRender
吗?什么方法更适合可维护性?
更新:
对于第2点,我发现reRender的特性可以接受EL表达式,所以我尝试使用
<a4j:support event="onchange" action="#{Bean1.onSelectOneMenuChange}" reRender="#{Bean1.reRenderIDList}" /> .
在Bean1.onSelectOneMenuChange()中,我将Bean1.reRenderIDList设置为一组ID,该ID需要根据业务需求作为reRender。页面刷新时会运行Bean1.getRenderIDList()
。但是,当我在UI中更改<h:selectOneMenu>
的值时,Bean1.getRenderIDList()将永远不会再次运行。因此,文本框不能是reRender
?
有什么想法吗?
答案 0 :(得分:1)
您的代码看起来很好。更新模型阶段没有理由不发生(您不使用immediate=true
)。如果您有对话/验证错误,则永远不会调用该操作。检查你经历的阶段。