根据组合值更改输入

时间:2016-10-21 17:33:20

标签: jsf-2

我知道这个问题存在于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循环打印的<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> 。所以这是渲染的代码,我从循环中获取'john',我手动创建'example':

[tox]
envlist = py27,py35,flake8-27,flake8-35

# ...
[testenv:flake8-27]
basepython=python2.7
deps=flake8
commands=
flake8 projectdir

[testenv:flake8-35]
basepython=python3.5
deps=flake8
commands=
flake8 projectdir

它适用于'示例',但不适用于'john'。

1 个答案:

答案 0 :(得分:0)

最后我得到了答案。

<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。改变这个解决了这个问题。