Есть ли способ поймать событие livescroll в Primefaces Datatable? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть дата с livescroll в моем представлении и компонент ajaxstatus.С большинством компонентов я избегаю запуска диалога ajaxstatus, устанавливая:

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

в событии ajax, но я не нахожу способ сделать то же самое с datatable, так как есть «page» исобытия 'sort', но не событие 'scroll'.Есть идеи, как избежать этой ситуации?

1 Ответ

0 голосов
/ 25 сентября 2019

Если вы просто хотите получить поведение, подобное global="false", проще всего сделать переопределить соответствующую функцию в функции PrimeFaces Datatable.js и добавить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 не вызовет глобальный статус.К сожалению, я не могу найти ссылку на то, как это сделать.

Однако вы можете переопределить поведение по умолчанию в отсутствие параметра global, переопределив Primefaces.ajax.Request.handle

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 в ложь при отсутствии

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);
}

Выберите.

...