2012-03-11 12 views
1

私は3つのリッチ:id select1、select2、select3を持つ選択コントロールを持っています。select1、コントロール "select2"私はコントロールselect2をクリックし、select3はレンダリングされます。私はnetbeans 7.0.1でアプリケーションを作成し、framework jsf 2.0とrichFaces 4.2.0を使用しました。2つのリッチ:Ajaxの競合の問題(3つのリッチ:選択コントロール)

私の解決策は、select1とselect2 selectItemイベントでselect2とselect3のレンダリングを割り当てるために、id ajax1とajax2を持つ2つのa4j:ajaxを作成することです。 id1を持つキューにajax1とajax2を配置しました。ここで

は、ページのコードです:

<h:form> 
    <a4j:queue name="queue1" onerror="window.alert('alert in queue');" onrequestdequeue="window.alert('queue1 dequeue');" onrequestqueue="window.alert('queue1 enqueue');" requestDelay="1000" ignoreDupResponses="true"/> 
    <h3 style="text-align: center">Test case 1: 3 selection controls problem</h3> 

    <br/><br/> 
    <h:outputLink value="../index.xhtml">View Index </h:outputLink> 
    <br/><br/> 
    Problem: <h:outputText escape="false" value="#{carBean.testDescription}"/> 
    <br/><br/> 
    <table> 
     <tr> 
      <td>Car Firm (selection1)</td> 
      <td>Car type (selection2)</td> 
      <td>Production (selection3)</td> 
     </tr> 
     <tr> 
      <td> 
     <rich:select id="select1" value="#{carBean.companyName}" maxListHeight="100" enableManualInput="true" defaultLabel="Type here">  
      <a4j:ajax id="ajax1" queueId="queue1" execute="@form" render="select2, errorText" event="selectitem" listener="#{carBean.changeCompanyEvent()}"> 

      </a4j:ajax>         
      <f:selectItems value="#{carBean.lstCompany}"></f:selectItems> 
     </rich:select> 
     </td> 
     <td> 
     <rich:select id="select2" value="#{carBean.typeName}" maxListHeight="100" enableManualInput="true" defaultLabel="Type here" >  
      <a4j:ajax id="ajax2" queueId="queue1" immediate="true" execute="@form" render="select3, errorText" event="selectitem" listener="#{carBean.changeCarTypeEvent()}"> 

      </a4j:ajax>         
      <f:selectItems value="#{carBean.lstCarType}"></f:selectItems> 
     </rich:select> 
     </td> 
     <td> 
     <rich:select id="select3" value="#{carBean.productionName}" 
        maxListHeight="100" enableManualInput="true" defaultLabel="Type here" >            
      <f:selectItems value="#{carBean.lstCarProduction}"></f:selectItems> 
     </rich:select> 
     </td> 
     </tr> 
    </table> 
    <br/><br/> 
    <h:outputText id="errorText" escape="false" value="#{carBean.alertError}"/> 

</h:form> 

問題が発生しました:SELECT2を設定する必要があり

  • :私は、私はまだ、まだ理由が見つからない2つの問題を抱えていますimmediate = true、そうでない場合、ajax2で定義されたイベントは実行されません。

私はこの原因がわかりません。

  • select2にimmediate = trueを設定すると、ajax2イベントが呼び出されました。しかし、select2コントロールの値として割り当てられ、まだ値が割り当てられていないtypeName変数が選択されているため、select3にまだ値が割り当てられていません。ここで

誤差画像です:http://i970.photobucket.com/albums/ae190/swenteiger7/richFaces%20error-%20110312/testcase1Error.png

アプリケーション:私もこの質問と仲良くする(ネット豆のIDEで開かれた)私のアプリケーションプロジェクトを送りました。 - CarBeanが管理するBeanを定義したWeb/Web-INFフォルダのfaces-config.xmlファイル - Webフォルダのtestcase1フォルダ(threeSelectExample.xhtmlを持つ)。 - Beanパッケージとutilsパッケージを使用してマネージドBeanを保存します(testcase1ではCarBeanが管理するBeanに集中します)。

私の添付ファイルに私のアーカイブプロジェクトをダウンロードできます。 http://www.mediafire.com/?fnab3824b8vwd93

あなたがダウンロードするためにいくつかの問題がある場合は、ご連絡ください:ここでは

が自分のアプリケーションである(https://community.jboss.org/wiki/HowToAddRichFaces4xToProjectsNotBasedOnMaven)アプリケーションを実行するためにJSF2.0とRichFacesのフレームワークを追加してください。私。ありがとうございました。

答えて

0

私はrich:selectと同様の問題がありました。これを解決するには、h:selectOneMenuに変更し、onchange javascript関数にajax機能を追加する必要がありました。さらに、ajaxアプローチを使用している場合は、h:selectOneMenuvalueChangeListenerを使用して、value属性の代わりに選択した値を設定する必要があります。私はあなたのManagedBeanで

<h:selectOneMenu id="select1" maxListHeight="100" 
    enableManualInput="true" defaultLabel="Type here" 
    valueChangeListener="#{carBean.changeCompanyName}"> 
    <f:selectItems value="#{carBean.lstCompany}"></f:selectItems> 
    <a4j:ajax id="ajax1" queueId="queue1" execute="@form" 
     render="select2, errorText" event="selectitem" 
     listener="#{carBean.changeCompanyEvent()}"> 
</h:selectOneMenu> 

サンプルをもらおう

、あなたがこのようなコードが必要です。

@ManagedBean(name="carBean") 
@ViewScoped 
public class CarBean implements Serializable { 
    private String companyName; 
    //getters and setter... 
    //constructor and other functions 
    public void valueChangeMethod(ValueChangeEvent e){ 
     companyName = (String)e.getNewValue(); 
    } 
} 

をRichFacesのフォーラムに投稿about this issueがあります。さらに、populating child menu'sについてのBalusC(JSFエキスパート)のブログエントリ。

+0

あなたの驚くべき答えに感謝します。私はそれを確認します:) –

+0

こんにちはLuiggi。私は3日前にあなたの提案を試みました。私はまだ2つのajaxイベントを使用することはできません。この問題は、2 を使用し、残念なことに

関連する問題