【发布时间】:2011-02-18 19:11:11
【问题描述】:
<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()。之后,所有的文本框都重新渲染。因为没有调用更新模型值阶段,所以用户输入的值永远不会设置在 Bean1 中,原始值显示在 reRender 之后的文本框中。
我想问:
如何在
Bean1.onSelectOneMenuChange()中手动调用更新模型值阶段?如何获取Bean1.onSelectOneMenuChange()内部用户输入的值输入,并将其设置为Bean1的对应字段?另一种方法是只重新渲染那些值在 Bean1.onSelectOneMenuChange() 中更新的文本框。但是,有很多情况。例如,一个值会改变所有文本框的值,而一个值可能只会改变一些文本框的值。我怎样才能有条件地
reRender?哪种方法更便于维护?
更新:
对于第 2 点,我发现 reRender 属性可以接受 EL 表达式,所以我尝试使用
<a4j:support event="onchange" action="#{Bean1.onSelectOneMenuChange}" reRender="#{Bean1.reRenderIDList}" /> .
在 Bean1.onSelectOneMenuChange() 中,我将 Bean1.reRenderIDList 设置为一组需要根据业务需求重新渲染的 ID。 Bean1.getRenderIDList() 在页面刷新时运行。但是,当我在 UI 中更改 <h:selectOneMenu> 的值时, Bean1.getRenderIDList() 将永远不会再次运行。因此,文本框不能是reRender?
有什么想法吗?
【问题讨论】: