2016-10-21 73 views
0

我知道这个问题存在于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> 

它与“示例”而与“约翰”。

+0

你可以用f:selectItems代替c:forEach –

+0

对不起,我不明白。你是什么意思?这是如何解决问题的? – user1156544

+0

好吧,现在我明白你在说什么了。我已将c:forEach更改为f:selectedItems,但仍未获得值。只有手动放置selectItem时,它似乎可以与它们一起工作。使用f:selectedItems只会删除输入字段。由于生成的代码对于所有选项都是相同的,因此必须有其他东西丢失 – user1156544

回答

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