我有一个非常简单明了的问题。 有没有什么方法可以检测dataTable中的变化?
让我们说,我有一个使用分页的dataTable。现在,当我从第1页到第2页时,我需要检测此事件并在同一页面上更新gMap组件(我需要gMap从支持bean刷新其dataModel)。我尝试使用更新参数,但正如PF文档提到的那样,它已被弃用且无效。
我可以通过手动点击p:按钮来更新gMap,但是我需要在dataTable更改后自动完成。
也许通过使用javascript并将数据表小部件绑定到某个操作有一个解决方案,但我真的不知道:(
提前感谢您提供任何帮助
更新
我初始化LazyDataMethod的方法是:
private LazyDataModel<Poi> lazyModel;
private void initializeLazyModel() {
lazyModel = new LazyDataModel<Poi>() {
@Override
public List<Poi> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
List<Poi> data = service.getPoisLazily(first, pageSize, sortField, sortOrder, filters);
pois = data;
createMapForPOIs(pois);
return data;
}
};
lazyModel.setRowCount(getNumberOfRows());
}
接下来只有LazyDataModel的getter / setter:
public LazyDataModel<Poi> getLazyModel() {
return lazyModel;
}
public void setLazyModel(LazyDataModel<Poi> lazyModel) {
this.lazyModel = lazyModel;
}
在pois.xhtml中我有如下数据表声明:
<p:dataTable update="formMap:map" id="tablePois" var="poi" value="#{poiController.lazyModel}" lazy="true"
paginator="true" rows="10" paginatorPosition="bottom"
selection="#{poiController.poi}" rowSelectListener="#{poiController.showPoi}" selectionMode="single"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15,30,50">
<p:column>
<h:outputText value="#{poi.name}" />
</p:column>
</p:dataTable>
所以此时我想使用
RequestContext context = RequestContext.getCurrentInstance();
context.addPartialUpdateTarget("form:gMapId");
按照@spauny的建议。但是不知道在支持bean中的位置。
答案 0 :(得分:1)
希望你使用Primefaces 3.0.M4 ......
可能有两种解决方案:第一种只涉及Primefaces,更具体地说,只涉及RequestContext
组件。由于Primefaces的强大功能,您可以获得(服务器端)RequestContext实例并使用名为addPartialUpdateTarget
的方法。在用户请求另一页面之后,再次调用返回列表的方法;这是您更新gMap(server-side)
的最佳时间:
RequestContext context = RequestContext.getCurrentInstance();
context.addPartialUpdateTarget("form:gMapId");
您可以在此处找到信息:http://www.primefaces.org/showcase-labs/ui/requestContext.jsf,当然您也可以阅读适用于3.0.M4的Primefaces用户指南。
还有另一个解决方案当然它比第一个解决方案(在此上下文中)要糟糕得多,但可以在另一种情况下帮助你:dataTable pagination
它是懒惰的(这意味着每次都会发出ajax请求)用户请求另一页结果),因此您可以使用ajaxStatus
组件(http://www.primefaces.org/showcase-labs/ui/ajaxStatusHome.jsf - 查看声明式和编程式)拦截ajax请求,并onstart
可以调用javascript函数(可能具有ajax功能) - 当然downsides
是您必须实现该功能,但最糟糕的是您每页只能实现一个ajax状态(这意味着每个ajax请求都会调用您的javascript函数)具有ajax功能)。
所以你最好使用RequestContext,但是ajaxStatus它是一个非常好的和重要的组件:你可以为每个ajax请求显示一个加载gif,或者调用一个javascript函数来向用户显示一些好的/有趣的东西(在页面中)。 / p>