有没有办法在Primefaces数据表中捕获生命滚动事件?

时间:2019-09-24 22:45:11

标签: ajax events scroll primefaces datatable

我的数据表中包含livecroll和ajaxstatus组件。对于大多数组件,我可以通过设置避免触发ajaxstatus对话框:

<p:ajax event="someEvent" global=false\>

在ajax事件中,但是我找不到一种对数据表执行相同操作的方法,因为有'page'和'sort'事件,但没有'scroll'事件。有什么想法可以避免这种情况吗?

1 个答案:

答案 0 :(得分:0)

如果您只是想实现行为global="false",最简单的方法是override relevant function in the PrimeFaces Datatable.js function并在选项中添加global: false在后台进行的ajax调用。

这可以通过添加以下javascript

来完成
PrimeFaces.widget.DataTable.prototype.loadLiveRows: function() {
    if(this.liveScrollActive||(this.scrollOffset + this.cfg.scrollStep > this.cfg.scrollLimit)) {
        return;
    }

    this.liveScrollActive = true;
    this.scrollOffset += this.cfg.scrollStep;

    //Disable scroll if there is no more data left
    if(this.scrollOffset === this.cfg.scrollLimit) {
        this.shouldLiveScroll = false;
    }

    var $this = this,
    options = {
        source: this.id,
        process: this.id,
        update: this.id,
        global: false,    /* Added this so the global is not triggered */
        formId: this.cfg.formId,
        params: [{name: this.id + '_scrolling', value: true},
                        {name: this.id + '_skipChildren', value: true},
                        {name: this.id + '_scrollOffset', value: this.scrollOffset},
                        {name: this.id + '_encodeFeature', value: true}],
        onsuccess: function(responseXML, status, xhr) {
            PrimeFaces.ajax.Response.handle(responseXML, status, xhr, {
                widget: $this,
                handle: function(content) {
                    //insert new rows
                    this.updateData(content, false);

                    this.liveScrollActive = false;
                }
            });

            return true;
        },
        oncomplete: function(xhr, status, args, data) {
            if(typeof args.totalRecords !== 'undefined') {
                $this.cfg.scrollLimit = args.totalRecords;
            }

            $this.loadingLiveScroll = false;
            $this.allLoadedLiveScroll = ($this.scrollOffset + $this.cfg.scrollStep) >= $this.cfg.scrollLimit;

            // reset index of shift selection on multiple mode
            $this.originRowIndex = null;
        }
    };

    PrimeFaces.ajax.Request.handle(options);
},

不幸的是,无法部分覆盖和重用大多数(全部)现有功能。我以为您可以全局方式覆盖global,因此没有ajax调用会触发全局状态。不幸的是,我再也找不到有关该操作的参考。

但是,您可以通过覆盖Primefaces.ajax.Request.handle

来在没有global设置的情况下覆盖默认行为。
handle: function(cfg, ext) {
    cfg.ext = ext;

    if (PrimeFaces.settings.earlyPostParamEvaluation) {
        cfg.earlyPostParams = PrimeFaces.ajax.Request.collectEarlyPostParams(cfg);
    }

    if(cfg.async) {
        PrimeFaces.ajax.Request.send(cfg);
    }
    else {
        PrimeFaces.ajax.Queue.offer(cfg);
    }
},

通过将cfg.global的显式设置添加为false(如果不存在)

var orgHandle = PrimeFaces.ajax.Request.handle;
Primefaces.ajax.Request.prototype.handle = function(cfg, ext) {
     var global = (cfg.global === false || cfg.global === undefined) ? false : true;
     cfg.global = global;
     orgHandle(cfg, ext);
}

选择。