根据组合值更改输入

Change input based on combo value

我知道这个问题存在于 SO 的其他地方,但解决方案已经过时(并且 JSF 似乎已经改进了很多)或者我无法使解决方案起作用。

听起来很简单,我想根据组合框的值替换输入元素的文本。我想使用 Ajax,并希望即使组合中只有一个元素也能正常工作(默认情况下组合的选择是否为空并不重要)。

<h:selectOneMenu id="fnamecombo" valueChangeListener="#{namesController.setForename(fnamecombo)}">
    <c:forEach items="#{namesController.myForenames}" var="myforename">
        <f:selectItem itemValue="#{myforename}" itemLabel="#{myforename}" />
    </c:forEach>
    <f:ajax render="fnameinput"  />
</h:selectOneMenu>

<h:inputText value="#{namesController.forename}" id="fnameinput" />

这行不通。所以首先,我不知道如何调用 setForename 方法。如果我使用 valueChangeListener="#{namesController.setForename('xxxxx')}" 它会起作用,但只有第一次并且当且仅当组合中有多个元素,否则事件似乎不会被触发。

简单的解决方法是什么?


编辑

好的,所以我取得了进步。这比我预期的要容易:

<h:selectOneMenu id="fnamecombo" value="#{namesController.forename}">
    <c:forEach items="#{namesController.myForenames}" var="myforename">
        <f:selectItem itemValue="#{myforename}" itemLabel="#{myforename}" />
    </c:forEach>
    <f:ajax render="fnameinput"  />
</h:selectOneMenu>

<h:inputText value="#{namesController.forename}" id="fnameinput" />

这似乎适用于我手工创建的 selectItem,但不适用于使用 foreach 循环打印的 selectItem。所以这是呈现的代码,我从循环中获得 'john' 并手动创建 'example':

<select id="myForm:fnamecombo" name="myForm:fnamecombo" size="1" onchange="mojarra.ab(this,event,'valueChange',0,'myForm:fnameinput')">
    <option value="example">example</option>
    <option value="john">john</option>
</select>

它适用于 'example' 但不适用于 'john'。

终于找到答案了

<h:selectOneMenu id="fnamecombo" value="#{namesController.forename}">
    <f:selectItems value="#{namesController.myForenames}" />
    <f:ajax render="fnameinput"  />
</h:selectOneMenu>

<h:inputText value="#{namesController.forename}" id="fnameinput" />

不需要 Alexandre Lavoie 提到的 forEach

This answer by Luiggi Mendoza 给了我找到它的提示。我的输入没有被 f:selectItems 中的值更新,而是在我手动引入的值中更新的原因是托管 bean 的范围。我意识到 input 实际上在任何情况下都在更新,但是当来自 f:selectItems 时,input 被更新为 null。为什么?因为 namesController 的范围是 @RequestScoped 而不是 @ViewScoped。更改它可以解决问题。