【问题标题】:How to detect update of PrimeFaces dataTable如何检测 PrimeFaces 数据表的更新
【发布时间】:2012-01-14 11:48:34
【问题描述】:

我有一个非常简单直接的问题。 有什么方法可以检测dataTable的变化吗?

假设我有一个使用分页的数据表。现在,当我从第 1 页转到第 2 页时,我需要检测此事件并在同一页面上更新 gMap 组件(我需要 gMap 从支持 bean 刷新其 dataModel)。我尝试使用更新参数,但正如 PF 文档所述,它已被弃用并且不起作用。

我可以通过手动单击 p:button 来更新 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 所建议的那样。但是不知道放在backing bean的什么位置。

【问题讨论】:

    标签: jsf-2 datatable primefaces


    【解决方案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,当然您也可以阅读 Primefaces 3.0.M4 用户指南。

    还有另一种解决方案,当然它比第一种更糟糕(在这种情况下),但可以在另一种情况下为您提供帮助:dataTable pagination 它很懒(这意味着每次用户都会发出 ajax 请求请求另一页结果),因此您可以使用ajaxStatus 组件(http://www.primefaces.org/showcase-labs/ui/ajaxStatusHome.jsf - 查看声明性和程序性)和onstart 来拦截 ajax 请求,您可以调用 javascript 函数(可能具有 ajax 功能) -当然downsides 是您必须实现该功能,但最糟糕的是每个页面只能实现一个ajax 状态(这意味着每个ajax 请求都会调用您具有ajax 功能的javascript 函数)。

    所以你最好使用 RequestContext,但是 ajaxStatus 它是一个非常好的和重要的组件:你可以为每个 ajax 请求显示一个加载 gif,或者调用一个 javascript 函数来向用户展示一些漂亮/有趣的东西(在页面中)。

    【讨论】:

    • 感谢您的回复...但不幸的是,我们使用的是 PF 2.2.1,目前无法更改。我从文档中意识到,也有一个 RequestContext。但是当我尝试在 BackingBean 中调用它时,上下文总是解析为 null(特别是这一行:context.addPartialUpdateTarget("formMap:map"); 返回 NullPointerException)。你知道,这是否应该在 PF 2.2.1 中工作?我试图将代码插入到 LazyDataModel 的 load() 方法和 LazyModel 的 getter(我的 DataTable 调用以获取模型的方法),但都不起作用:(什么是正确的地方?谢谢
    • @vojtak ReuqestContext 只能从 ajax 请求中初始化!还要检查是否有addPartialUpdateTarget(虽然我很确定有)...发布一些代码(更新问题),看看你是否做错了什么。
    • @vojtak 你应该告诉我你已经更新了你的代码!我没看到...尝试将 ReuqestContext 放入 getter getLazyModel(当然在返回之前)...您的问题解决了吗?
    猜你喜欢
    • 2017-08-17
    • 2015-03-04
    • 2014-10-08
    • 2013-09-15
    • 1970-01-01
    • 2013-02-21
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多