如何检测PrimeFaces dataTable的更新

时间:2011-12-06 21:46:21

标签: jsf-2 datatable primefaces

我有一个非常简单明了的问题。 有没有什么方法可以检测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中的位置。

1 个答案:

答案 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>