3
<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()直接调用。之后,所有的文本框都重新渲染。因为没有调用更新模型值阶段,所以用户输入的值永远不会设置为 Bean1 并且原始值显示在之后的文本框中reRender

我想问一下:

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

  2. 另一种方法是只重新渲染那些值在 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

任何想法?

4

1 回答 1

1

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

于 2010-05-13T22:22:29.680 回答