我有一个 p:dataTable 以及一些改变其内容的控件,例如页码,排序和过滤器参数。控件调用AJAX交互,以便每个更改调用SQL查询到后端,但只更新客户端浏览器中的表。这就是应该的样子,对吗?
我无法弄清楚是使视图书签能够的最佳做法。将书签参数放入支持bean很容易,例如:
<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>
所以说我添加一个radioButton控件来更改sortOrder。它可能看起来像这样:
<p:selectOneRadio value="#{bean.sortOrder}">
<p:ajax update="@form" />
<f:selectItem itemLabel="xxx" itemValue="1" />
(etc)
</p:selectOneRadio>
第一个问题:当启用这个启用AJAX的控件时,有没有办法保留OTHER参数,例如 orderNo 而不诉诸ViewScoped bean?
第二个问题:如何让浏览器的URL栏更新,以便在用户为该页面添加书签时,所有当前的表查询参数都会被保留?
非常感谢您的帮助。
答案 0 :(得分: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
}
要更新浏览器网址,您可以执行GET请求而不是ajax,也可以使用javascript历史记录API对其进行操作。
对于第一部分,您可以在ajax或命令组件中使用此实用程序请求bean函数。
/**
* 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);
}