2016-10-21 26 views
0

私はこの問題がSOのどこか他の場所に存在することを知っていますが、ソリューションが古い(JSFが多く改善されているようです)か、コンボの値に基づいて入力を変更してください

簡単なことですが、私はコンボボックスの値に基づいて入力要素のテキストを置き換えたいと思います。私はAjaxを使いたいと思います。コンボに要素が1つしかない場合でも、この機能を有効にしたいと思います(デフォルトでコンボの選択が空であれば問題ありません)。

<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')}"を使用すると、それは動作しますが、コンボに複数の要素がある場合は最初の時間とiffだけです。それ以外の場合、イベントは発生しないように見えます。

簡単な修正とは何ですか?


EDIT

[OK]をので、私は進歩を遂げています。私が予想以上に簡単だった:

<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" /> 

これは私が手ではなく、foreachループで印刷されたものの上に作成selectItemに動作するようです。だから、これは私がループから「ジョン」を得て、私は手動で「例」を作成し、レンダリングコード、次のとおりです。

<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

c:forEachの代わりにf:selectItemsを使うことができます –

+0

申し訳ありませんが、私は理解できません。どういう意味ですか?そして、これがどうやって問題を解決するのか? – user1156544

+0

OK、あなたが言ったことを理解しました。私は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から来たときにはnullに更新されました。どうして? namesControllerの範囲は@RequestScopedであり、@ViewScopedではないためです。これを変更することで問題は解決します。

関連する問題