2016-10-21 109 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。改變這個可以解決問題。