PrimeNG p表标头通过延迟加载和分页选择所有持久性

当前配置(无法将其更新为最新版本):
"@angular/cli": "^7.3.9","primeng": "7.0.5",

我有一个PrimeNG p表,其中有分页的延迟加载数据。
PrimeNG GitHub上也有一个开放的问题-https://github.com/primefaces/primeng/issues/8139
该问题已附加Stackblitz链接,因此未创建新链接。

场景:
在第一页的第一行中,通过选中复选框可以选择一些行。
在第二页上,选中标题中的“全选”复选框,并自动选择第二页上的所有行。
现在,当导航到第一页时,将重置此处的选择。但是标题中的“全选”复选框仍处于选中状态。

是否想知道是否有人可以解决此问题?

感谢您的帮助。

编辑: 在另一个类似的GitHub问题中找到了解决方案:https://github.com/primefaces/primeng/issues/6482

解决方案: https://github.com/primefaces/primeng/issues/6482#issuecomment-456644912

有人可以帮助在Angular 7/8应用程序中实现重写吗?无法理解如何获取TableHeaderCheckbox参考并覆盖原型。

jgkzh 回答:PrimeNG p表标头通过延迟加载和分页选择所有持久性

嗯,问题的解决方案仍未添加到PrimeNG存储库中,因此即使最新的软件包也无法解决。

暂时,请使用修改

下问题中提到的解决方案

要回答我在编辑下提出的问题,请检查以下内容:

// In some service file:

import { Table,TableHeaderCheckbox } from 'primeng/table';

@Injectable()
export class BulkSelectAllPagesService {

overridePrimeNGTableMethods() {
    TableHeaderCheckbox.prototype.updateCheckedState = function () {
        const currentRows = map(this.dt.value,this.dt.dataKey);
        const selectedRows = map(this.dt.selection,this.dt.dataKey);
        this.rowsPerPageValue = this.dt.rows;
        const commonRows = intersection(currentRows,selectedRows);
        return commonRows.length === currentRows.length;
    };

    Table.prototype.toggleRowsWithCheckbox = function (event,check) {
        let _selection;
        if (!check) {
            _selection = this.value.slice();
            each(_selection,(row) => {
                const match = {}; match[this.dataKey] = row[this.dataKey];
                remove(this._selection,match);
            });
        } else {
            _selection = check ? this.filteredValue ? this.filteredValue.slice() : this.value.slice() : [];
            each(this._selection,(row) => {
                const match = {}; match[this.dataKey] = row[this.dataKey];
                remove(_selection,match);
            });
            this._selection = this._selection.concat(_selection);
        }

        this.preventSelectionSetterPropagation = true;
        this.updateSelectionKeys();
        this.selectionChange.emit(this._selection);
        this.tableService.onSelectionChange();
        this.onHeaderCheckboxToggle.emit({
            originalEvent: event,affectedRows: _selection,checked: check
        });
    };
}

// In app.component.ts

import { Component,OnInit } from '@angular/core';
import { BulkSelectAllPagesService } from 'PATH_TO_THE_FILE/bulk-select-all-pages.service';

@Component({
    selector: 'app-root',templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {

    constructor(
        private bulkSelectAllPagesService: BulkSelectAllPagesService) {

    }

    ngOnInit() {
        this.bulkSelectAllPagesService.overridePrimeNGTableMethods();
    }
}

当然需要在app.module.ts的providers[]中包含服务文件

将创建一个堆叠闪电战并稍后添加。

用于处理行范围分组数据的改进版本:

overridePrimeNGTableMethods() {
    TableHeaderCheckbox.prototype.updateCheckedState = function () {
        const currentRows = map(this.dt.value,this.dt.dataKey);
        const uniqueCurrentRows = uniq(currentRows);
        const selectedRows = map(this.dt.selection,selectedRows);
        if (currentRows.length) {
            return commonRows.length === uniqueCurrentRows.length;
        } else {
            return false;
        }
    };

    Table.prototype.toggleRowWithCheckbox = function (event,rowData) {
        const findIndexesInSelection = (selection: any = [],data: any = {},dataKey: any) => {
            const indexes = [];
            if (selection && selection.length) {
                selection.forEach((sel: any,i: number) => {
                    if (data[dataKey] === sel[dataKey]) {
                        indexes.push(i);
                    }
                });
            }
            return indexes;
        };

        this.selection = this.selection || [];
        const selected = this.isSelected(rowData);
        const dataKeyValue = this.dataKey ? String(ObjectUtils.resolveFieldData(rowData,this.dataKey)) : null;
        this.preventSelectionSetterPropagation = true;
        if (selected) {
            const selectionIndexes = findIndexesInSelection(this.selection,rowData,this.dataKey);
            const selectedItems = this.selection.filter((val: any) => {
                return val[this.dataKey] === rowData[this.dataKey];
            });
            this._selection = this.selection.filter((val: any,i: number) => {
                return selectionIndexes.indexOf(i) === -1;
            });
            this.selectionChange.emit(this.selection);
            selectedItems.forEach((selectedItem: any,index: number) => {
                this.onRowUnselect.emit({ originalEvent: event.originalEvent,index: event.rowIndex + index,data: selectedItem,type: 'checkbox' });
            });
            delete this.selectionKeys[rowData[this.dataKey]];
        } else {
            let rows = [rowData];
            if (dataKeyValue) {
                rows = this.value.filter(val => {
                    return (val[this.dataKey]).toString() === dataKeyValue;
                });
            }
            this._selection = this.selection ? this.selection.concat(rows) : rows;
            this.selectionChange.emit(this.selection);
            this.onRowSelect.emit({ originalEvent: event.originalEvent,index: event.rowIndex,data: rowData,type: 'checkbox' });
            if (dataKeyValue) {
                this.selectionKeys[dataKeyValue] = 1;
            }
        }
        this.tableService.onSelectionChange();
        if (this.isStateful()) {
            this.saveState();
        }
    };

    Table.prototype.toggleRowsWithCheckbox = function (event,checked: check
        });
    };
}
本文链接:https://www.f2er.com/3167243.html

大家都在问