2011-01-20 67 views
4

私のJSFアプリケーションの1つに、上部にヘッダー部分にselectOneMenuがあり、下部にコンテンツフィルタ部分が表示されています。デフォルトでは、アプリケーションは最初のselectOneMenuデータを上部に表示し、対応するFilter情報を下部に表示します。ユーザが異なるselectOneMenuデータを選択した場合、対応するフィルタ情報を下位コンテンツ部分にロードする必要があります。JSF divコンポーネントを表示/非表示

フィルタコンポーネントにはCommandButtonがあり、ユーザーはフィルタ情報を入力します。ボタンをクリックすると、フィルターが承認されます。アプリケーションは、フィルターコンポーネントの代わりに別のコンポーネント - Report.xhtmlをロードする必要があります。つまり、フィルタコンポーネントは、下部コンテンツ部分のレポートに置き換えてください。

selectOneMenu項目をクリックすると、処理が繰り返されます。それはディスプレイのフィルター画面などです。

問題領域 1.フィルタフォームを表示できません。コンテンツパートのレポートフォームを非表示にします。 2. Filter-commandButtonのバッキングBeanは値を返します。結果に応じて、Filterの代わりにReportを表示する必要があります。

デザインが正確であるとは確信していませんが、これが意図したとおりに動作しない場合は、お勧めします。貴重な回答をいただければ幸いです。私はアプリケーションのajaxベースのままにしたいと思うし、私はボタンイベントのページ全体をリロードしたくない。

GDK


<h:form id="form1">  
<h:selectOneMenu value="#{states.stateName}"> 
    <f:selectItems value="#{states.stateChoices}"/> 
    <f:ajax render=":Filter"/> 
</h:selectOneMenu> 
</h:form> 
    <h:form id="Filter"> 
     <div id="content">    
     <h:panelGroup id="one" rendered="Need a condition from form1 to display this"> 
      #{states.stateName} 
      <br/>Report 
      <h:inputText id="report" value="#{Counties.report}" style="width:150px"/> 
      <h:commandButton id="OK" value="OK" actionListener="#{Counties.getReports}"> 
      <f:param name="CatName" value="Dekalb" />    
      </h:commandButton>     
     </h:panelGroup>   
     </div> 
    </h:form> 
    <h:form id="Report"> 
     <div id="content"> 
     <h:panelGroup id="two" rendered="#{should be rendered on acceptance from OK command button}"> 
      <ui:include src="Report.xhtml"/> 
     </h:panelGroup> 
      </div> 
    </h:form> 

答えて

9

はここ最小例(私も規格を遵守するための命名をサニタイズするとても親切でした)です:

CountiesマネージドBeanはAは
<h:form> 
    <h:selectOneMenu value="#{states.stateName}"> 
    <f:selectItems value="#{states.stateChoices}" /> 
    <f:ajax render=":filter" /> 
    </h:selectOneMenu> 
</h:form> 
<h:panelGroup id="filter"> 
    <h:panelGroup rendered="#{not empty states.stateName}"> 
    <h:form rendered="#{not counties.accepted}"> 
     <h:inputText value="#{counties.report}" /> 
     <h:commandButton value="OK" action="#{counties.viewReport}"> 
     <f:ajax execute="@form" render=":filter" /> 
     </h:commandButton> 
    </h:form> 
    <h:form rendered="#{counties.accepted}"> 
     <ui:include src="report.xhtml"/> 
    </h:form> 
    </h:panelGroup> 
</h:panelGroup> 

新しいbooleanプロパティaccepted

@ManagedBean 
@ViewScoped 
public class Counties { 

    private boolean accepted; 

    public void viewReport() { 
     if (some condition) { 
      accepted = true; 
     } 
    } 

    public boolean isAccepted() { 
     return accepted; 
    } 

} 
+0

こんにちはBalusC、ありがとうございました。それは本当に私の問題を解決しました。私はあなたの速い応答に本当に感謝します。 (コンテンツにreport.xhtmlを表示した後、selectOneMenuアイテムをクリックすると、再びFilterが表示されます。メソッドアクション= "" で、メソッドで 'accepted'をfalseにリセットしなかったので、問題は解決しませんでした。 GDK – GDK

+0

こんにちはBalusC、このコード(あなたの)は、最初の繰り返しのために動作します。選択メニューをクリックすると、入力テキストとOKボタンが表示されます。 2回目以降、[OK]ボタンをクリックすると#{counties.viewReport}関数は呼び出されません。 OKボタンをもう一度クリックすると、#{counties.viewReport}関数が呼び出されます。つまり、有効にするにはOKボタンをダブルクリックする必要があります。あなたはこの行動を説明していただけますか? GDK – GDK

+1

ボタンの押下が失敗した場合、特定のリクエスト中に 'stateName'が空であるか、' accepted'が 'false'であることを意味します。ボタンまたはその親のうちの1つのレンダリングされた属性が、要求値の適用フェーズ中に「偽」を評価するとき、アクションは呼び出されません。ただし、Beanがビュースコープである限り、これは正常に動作するはずです。後でそれらをプログラムでリセットしていませんか? – BalusC