我知道这个问题存在于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'。
答案 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
。改变这个解决了这个问题。