2011-03-21 3 views
1

私はときのinputTextフィールドにユーザーの種類selecOneMenuコンテンツを生成し、コンボボックスの選択変更に対応します。
以下のコードは、selecOneMenuの内容をユーザーのタイプとして更新します。 (型付きと次の9つの数字がこれは単なる単純化されたサンプルコードです。コンボボックスに追加されます。)
ページがロードされると、selecOneMenuの変更イベントが正しくトリガーされます。 しかし、inputValueフィールドに入力した後、selecOneMenuの内容が変更され、アイテムを選択するとchangeイベントが発生しません。 ComboBeanがセッションスコープのですが、私は可能な場合は、このソリューションを避けたい場合はPrimeFaces P:AJAXイベント=「変更」が上の解雇ではない動的に作成selecOneMenuコンテンツ

コードが動作します。

は、それがこれを行うには、まったく可能ですか?
リクエストスコープでは不可能な理由は何ですか?

PrimeFaces 2.2
クロサギ科2.0.2
のGlassFish 3.0.1
ブラウザ:クロム、Firefoxの、IE

combo.xhtml:

<h:head> 
    <title>Combo box example</title> 
</h:head> 

<h:body> 
    <h:form> 
     <p:panel id="mainPanel"> 
      <h:panelGroup id="formToSubmit" layout="block"> 
       <p:messages id="messages" /> 
       <h:panelGrid columns="2"> 
        <h:outputLabel value="Enter a number" /> 
        <h:inputText id="inputValue" value="#{comboBean.inputValue}"> 
         <p:ajax event="keyup" update="combo" 
          listener="#{comboBean.onKeyUp}" /> 
        </h:inputText> 

        <h:outputLabel value="Select a value:" /> 
        <h:selectOneMenu id="combo" value="#{comboBean.selectedValue}"> 
         <f:selectItem itemLabel="Select a value..." 
          noSelectionOption="true" /> 
         <f:selectItems value="#{comboBean.values}" /> 
         <p:ajax event="change" update="selectedValue" 
          listener="#{comboBean.valueSelected}" /> 
        </h:selectOneMenu> 
        <h:outputLabel value="Selected value:" /> 
        <h:inputText id="selectedValue" value="#{comboBean.selectedValue}" /> 
       </h:panelGrid> 
      </h:panelGroup> 
     </p:panel> 
    </h:form> 
</h:body> 
</html> 

ComboBean.java

package x; 

import java.io.Serializable; 
import java.util.LinkedList; 
import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.enterprise.context.RequestScoped; 
import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 

@Named 
@RequestScoped 
public class ComboBean implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 
    private String inputValue; 
    private String selectedValue; 
    private List<String> values; 

    @PostConstruct 
    void init() 
    { 
     System.out.println("init"); 
     setValues(new LinkedList<String>()); 
     for(int i = 0; i<10 ; i++) 
     { 
      getValues().add(""+i); 
     } 
    } 

    public void onKeyUp() 
    { 
     System.out.println("onkeyUp " + getInputValue()); 
     setValues(new LinkedList<String>()); 
     if (inputValue != null) 
     { 
      try 
      { 
       int v = Integer.parseInt(inputValue); 
       for(int i = 0; i<10 ; i++) 
       { 
        getValues().add(""+(v+i)); 
       } 
      } 
      catch (NumberFormatException ne) 
      { 
       //doesn't matter 
      } 
     } 
    } 

    public void valueSelected() 
    { 
     System.out.println("valueSelected " + getSelectedValue()); 
    } 

    public void submit() 
    { 
     System.out.println("submit " + getInputValue()); 
    } 

    public void setInputValue(String inputValue) 
    { 
     this.inputValue = inputValue; 
    } 

    public String getInputValue() 
    { 
     return inputValue; 
    } 

    public void setSelectedValue(String selectedValue) 
    { 
     this.selectedValue = selectedValue; 
    } 

    public String getSelectedValue() 
    { 
     return selectedValue; 
    } 

    public void setValues(List<String> values) 
    { 
     this.values = values; 
    } 

    public List<String> getValues() 
    { 
     return values; 
    } 

} 

答えて

3

問題は、init()方法における各要求中にあなたのリストをリセットすることです。選択された要素はもう存在しません。

SessionScopeを使用しない場合は、おそらくViewScopeが解決策になります。同じページが再読み込みされると、Beanはリセットされません。

+0

こんにちはマット、あなたの答えに感謝。残念ながら、これはCDI Beanで、ViewScopeはありません。一方、マネージドBeanを使用する場合は、@ Injectアノテーションを使用できません(申し訳ありませんが、コードは単純化されすぎています:))。 – Hesi

+0

おそらくLinkedListだけをSessionStateに入れ、それをあなたのRequestScoped beanから参照することはできますか? –

+0

これはうまくいくようです!ありがとう! – Hesi

関連する問題