根据组合值更改输入
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
。更改它可以解决问题。
我知道这个问题存在于 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
。更改它可以解决问题。