【问题标题】:Unable to use primeng <p-datatable> virtual scroll lazy load无法使用primeng <p-datatable> 虚拟滚动延迟加载
【发布时间】:2017-09-19 05:31:13
【问题描述】:

我正在尝试使用primeng &lt;p-datatable&gt; 为大量数据实现延迟加载。我已经完成了官方网站上记录的所有内容,但是我无法使其正常工作。

onLazyLoad 回调仅在加载表时运行一次。它不会按预期在每次滚动时触发。

<div style="max-height:300px; border:1px solid black;overflow-y:auto">
      <p-dataTable #pocListref [value]="data" rowHover="true" [(selection)] = "selectedData" scrollable="true" scrollHeight="200px" [rows]="4"
      [style]="{'margin-top':'30px'}"  [paginator]="true" [rowsPerPageOptions]="[5,10,20]"
        [lazy]="true" [totalRecords]="totalRecords" (onLazyLoad)="lazyLoad($event)">
        <p-column header="Id">
        <ng-template pTemplate="body" let-index="rowIndex">
            {{index}}
        </ng-template>
        </p-column>
        <p-column  selectionMode="multiple" [style]="{'width':'5%'}"></p-column>
        <p-column field="name" header="Name"[sortable]="true"></p-column>
        <p-column field="age" header="Age" [sortable]="true"></p-column>
        <p-column field="company" header="Company" [sortable]="true"></p-column>
      </p-dataTable>
  </div>

分页器实现同样适用。我注意到只有当我不使用 virtualScroll 属性时它才适用于分页器,这是有道理的,但不知何故 virtualScroll 对滚动没有任何影响。

我知道已经有一个类似的question,但它仍然得到了答复。

有人通过延迟加载成功使用了虚拟滚动。任何建议都会很有用。

【问题讨论】:

标签: angular lazy-loading primeng primeng-datatable


【解决方案1】:

试试我的例子:

这是我更新的代码,没有分页器并使用 virtualScroll

<p-dataTable [value]="resultsArr" scrollable="true" scrollHeight="100px" [rows]="4" virtualScroll="virtualScroll" [style]="{'margin-top':'30px'}" [lazy]="true" [totalRecords]="results.length" (onLazyLoad)="lazyLoad($event)">
<p-column header="Id">
<ng-template pTemplate="body" let-index="rowIndex">
    {{index}}
</ng-template>
</p-column>
<p-column  selectionMode="multiple" [style]="{'width':'5%'}"></p-column>
<p-column field="name" header="Name"[sortable]="true"></p-column>
<p-column field="age" header="Age" [sortable]="true"></p-column>
<p-column field="company" header="Company" [sortable]="true"></p-column>
</p-dataTable>

component.ts

export class Component {
    private results: Array<any> = []; // have 15+ objects in this array
    private resultsArr: Array<any> = [];

constructor() {
    this.results = [{
        name: "david",
        age: 26,
        company: "XYz Company"
    }, {
        name: "david",
        age: 26,
        company: "XYz Company"
    }, {
        name: "david",
        age: 26,
        company: "XYz Company"
    }, {
        name: "david",
        age: 26,
        company: "XYz Company"
    }, {
        name: "david",
        age: 26,
        company: "XYz Company"
    }, {
        name: "david",
        age: 26,
        company: "XYz Company"
    }]
}

    lazyLoad(event: any) {
        setTimeout(() => {
            if (this.results) {
                this.resultsArr = this.results.slice(event.first, (event.first + event.rows));
            }
        }, 250);
    }
}

component.html

<p-dataTable [value]="resultsArr" [lazy]="true" [totalRecords]="results.length" [responsive]="true"
             [paginator]="true" (onLazyLoad)="lazyLoad($event)" [rows]="5" [filterDelay]="500"
             [rowsPerPageOptions]="[5,10,20]" sortField="first_name" [sortOrder]="1">
  <p-column field="id" header="#" [sortable]="true" styleClass="columnId" [filter]="true"></p-column>
  <p-column field="first_name" header="First Name" [sortable]="true"></p-column>
  <p-column field="last_name" header="Last Name" [sortable]="true"></p-column>
</p-dataTable>

【讨论】:

  • 我还不能检查这个,但我看到你的解决方案使用了分页。我不想拥有分页器,而是希望在滚动时具有相同的行为
  • 还没有。问题是表格在滚动时没有给出任何事件。
  • 重要:[totalRecords]= 你的响应数组的长度值和 [value] 在lazyLoad 方法中只取切片
  • 是的..这也是我正在做的。如前所述,lazyLoad 函数在加载时仅调用一次,此后不再调用。你能完成这项工作吗?如果是的话,plunker 将是一个很大的帮助。或者尝试编辑这个 plunker plnkr.co/edit/BZ607W2zY4V6DpR3NavP?p=preview
  • 这是我的示例 plunker 链接plnkr.co/edit/jwpbEhqAP27KlWZ8EO5W?p=preview 使用lazyScroll 事件它工作得很好。可能是你的primeng npm版本的问题。 am used primeng": "^4.2.1" 所以更新你的项目检查一下。
【解决方案2】:

我使用 p-table,但我认为它与 p-datatable 的延迟加载方式相同。 我用一个技巧解决了这个问题。我将totalRecords设置为一个大数字或比您当前数据大得多的数字(例如当前数据的长度为500,将totalRecords设置为1000),然后每次滚动都会触发延迟加载

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2020-08-18
    • 2011-01-11
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多