使用a4j:support的onchange事件与h:selectOneMenu

时间:2010-05-12 19:06:26

标签: jsf richfaces ajax4jsf

<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.textbox1Bean1.textbox2Bean1.textbox3Bean1.textbox4的值(取决于所选的值(Bean1.val1))。有时,它会更改所有文本框值,有时它只会更改一些文本框值。

当用户更改“selectOneMenu”下拉列表控件中的值时,JSF框架不会调用更新模型值阶段,而是直接调用Bean1.onSelectOneMenuChange()。之后,所有文本框都是reRender。由于未调用更新模型值阶段,因此用户输入的值永远不会设置为Bean1,原始值将显示在reRender之后的文本框中。

我想问:

  1. 如何在Bean1.onSelectOneMenuChange()内手动调用更新模型值阶段?如何从Bean1.onSelectOneMenuChange()中的用户获取值输入并将其设置为Bean1的相应字段?

  2. 另一种方法是只有reRender那些在Bean1.onSelectOneMenuChange()内更新其值的文本框。但是,有很多情况。例如,值会更改所有文本框值,而值只能更改某些文本框值。我可以如何有条件地reRender吗?什么方法更适合可维护性?

  3. 更新:

    对于第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

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的代码看起来很好。更新模型阶段没有理由不发生(您不使用immediate=true)。如果您有对话/验证错误,则永远不会调用该操作。检查你经历的阶段。