2012-03-10 8 views
2

私はp:dataTableと、ページ番号、並べ替え、およびフィルタパラメータなどの内容を変更するための多数のコントロールを持っています。コントロールはAJAXのやりとりを呼び出し、各変更がバックエンドへのSQLクエリを呼び出しますが、クライアントブラウザのテーブルだけを更新します。それはそうなるはずですね、そうですか?JSF Ajaxとブックマークビューを組み合わせるにはどうすればよいですか?

私が理解できないことは、ビューをブックマークできるようにするためのベストプラクティスです。だから私ははsortOrderを変更するにRadioButtonコントロールを追加すると言う

 <f:metadata> 
      <f:viewParam name="orderNo" value="#{bean.orderNo}" /> 
      <f:viewParam name="sortOrder" value="#{bean.sortOrder}" /> 
      <f:viewParam name="showOpenItems" value="#{bean.showOpenItems}" />   
      <f:viewParam name="page" value="#{bean.page}" /> 
      <f:viewParam name="pageSize" vlaue="#{bean.pageSize}" /> 
     </f:metadata> 

:次のようなバッキングBeanへのブックマークのパラメータを取得するのに十分に簡単です。それは次のようになります。

<p:selectOneRadio value="#{bean.sortOrder}"> 
    <p:ajax update="@form" /> 
    <f:selectItem itemLabel="xxx" itemValue="1" /> 
     (etc) 
</p:selectOneRadio> 

最初の質問:このAJAXコントロールを有効に解雇されたViewScoped Beanに頼ることなく、このようなORDERNOなどの他のパラメータを保存する方法はありますか?

2番目の質問:ユーザーがページをブックマークすると、現在のすべてのテーブルクエリパラメータが保持されるように、ブラウザのURLバーを更新するにはどうすればよいですか?

ご協力いただきありがとうございます。

答えて

2

<f:param>を使用して任意のコンポーネントにパラメータを追加し、要求スコープのバッキングBeanからパラメータを読み取ることができます。 OmniFaces Components.getParams(UIComponent)機能を使用できます。

<p:selectOneRadio value="#{bean.sortOrder}"> 
    <p:ajax listener="#{bean.reload()}" update="@form" /> 
    <f:selectItem itemLabel="xxx" itemValue="1" /> 

    <f:param name="orderNo" value="#{bean.orderNo}"/> 
</p:selectOneRadio> 

が要求Beanにコンポーネントからのparamsを取得:

public void reload() 
{ 
    final FacesContext context = FacesContext.getCurrentInstance(); 
    final UIComponent component = UIComponent.getCurrentComponent(context); 

    List<ParamHolder> params = Components.getParams(component); 

    // extract orderNo param and reload your datasource 
} 

ブラウザのURLを更新するには、あなたが代わりにAjaxをGET-要求を実行するか、またはあなたはjavascriptの歴史のAPIを使用して、それを操作することができます。

最初の部分では、このユーティリティ要求Bean関数をajaxまたはコマンドコンポーネントで使用できます。

/** 
* Redirects to the given outcome by building a bookmarkable URL using all 
* child UIParameter's of the current component. 
* 
* @param outcome 
* @param includeViewParam 
* 
* @return 
*/ 
public void performActionParams(final String outcome, boolean includeViewParam) 
{ 
    final FacesContext context = FacesContext.getCurrentInstance(); 
    final UIComponent component = UIComponent.getCurrentComponent(context); 

    List<ParamHolder> params = Components.getParams(component); 

    String url = FacesLocal.getBookmarkableURL(context, outcome, params, includeViewParam); 
    FacesContextUtils.redirect(context, url); 
} 
関連する問題