TabView中的PrimeNG VirtualScroller无法正常工作

时间:2019-01-03 20:34:21

标签: angular primeng

我的Angular 7应用程序中有一个VirtualScroller,可惜在启动时没有呈现所有项目。

这是它的代码:

<p-virtualScroller [value]="financialItems" scrollHeight="400px" [itemSize]="150">
    <p-header>
        <div class="ui-g">
            <div class="ui-g-12 title-container">
                Title
            </div>
        </div>
    </p-header>
    <ng-template let-psp pTemplate="item">
        <div class="ui-g psp-item">
            <div class="ui-g-12 ui-md-1">
                <div style="font-size: 16px; text-align: left; margin-top: 15px;">Number:</div>
                <div style="font-size: 16px; text-align: left; margin-top: 15px;">Number:</div>
                <div style="font-size: 16px; text-align: left; margin-top: 15px;">Hint:</div>
            </div>
            <div class="ui-g-12 ui-md-3">
                <div style="font-size: 16px; text-align: left; font-weight: bold; margin-top: 15px;">{{ psp.orderNumber }}</div>
                <div style="font-size: 16px; text-align: left; margin-top: 15px; font-weight: bold;">{{ psp.pspNumber }}</div>
                <div style="font-size: 16px; text-align: left; margin-top: 15px; font-weight: bold;">{{ psp.hint }}</div>
            </div>
            <div class="ui-g-12 ui-md-3">
                <div class="ui-g">
                    <div class="ui-g-3 ui-sm-6">Dauer: </div>
                    <div class="ui-g-8 ui-sm-6">{{psp?.startDate.toLocaleString('de-DE', { year: 'numeric', month: 'numeric', day: 'numeric' })}} - {{psp?.endDate.toLocaleString('de-DE', { year: 'numeric', month: 'numeric', day: 'numeric' })}}</div>

                    <div class="ui-g-3 ui-sm-6">TCV: </div>
                    <div class="ui-g-8 ui-sm-6">{{psp?.planRevenue | number:'1.2-2':'de'}}</div>

                    <div class="ui-g-3 ui-sm-6">Kosten: </div>
                    <div class="ui-g-8 ui-sm-6">{{psp?.planCosts | number:'1.2-2':'de'}}</div>

                    <div class="ui-g-3 ui-sm-6">Stunden: </div>
                    <div class="ui-g-8 ui-sm-6">{{psp?.totalHours | number:'1.2-2':'de'}}</div>
                </div>
            </div>
            <div class="ui-g-12 ui-md-3">
                <div class="ui-g">
                    <div class="ui-g-6 ui-sm-6">Eigenumsatz: </div>
                    <div class="ui-g-6 ui-sm-6 bold-font">{{psp?.planOwnRevenue | number:'1.2-2':'de'}}</div>

                    <div class="ui-g-6 ui-sm-6">Nichteigener Umsatz: </div>
                    <div class="ui-g-6 ui-sm-6 bold-font">{{psp?.planOtherRevenue | number:'1.2-2':'de'}}</div>

                    <div class="ui-g-6 ui-sm-6">DB1-Kosten: </div>
                    <div class="ui-g-6 ui-sm-6 bold-font">{{psp?.costDB1 | number:'1.2-2':'de'}}</div>

                    <div class="ui-g-6 ui-sm-6">DB2-Kosten: </div>
                    <div class="ui-g-6 ui-sm-6 bold-font">{{psp?.costDB2 | number:'1.2-2':'de'}}</div>
                </div>
            </div>
            <div class="ui-g-12 ui-md-2">
                <div class="ui-g center-div">

                    <div class="ui-g-6 ui-sm-6">Gewährleistung: </div>
                    <div class="ui-g-6 ui-sm-6 bold-font">{{psp?.planWarranty | number:'1.2-2':'de'}}</div>

                    <div class="ui-g-6 ui-sm-6">Risiko: </div>
                    <div class="ui-g-6 ui-sm-6 bold-font">{{psp?.planRisk | number:'1.2-2':'de'}}</div>
                </div>
            </div>
        </div>
    </ng-template>
</p-virtualScroller>

tabView内部被调用:

<p-tabView class="main-tab-view" [style]="{'heigth':'100%'}">
    <p-tabPanel header="TestVS">
        <app-virtual-scroller></app-virtual-scroller>
    </p-tabPanel>
</p-tabView>

我的组件

private financialItems: FinancialItem[] = [];

ngOnInit() {
    this.initTestData();
}

  initTestData() {
    this.financialItems.push(new FinancialItem("Nr.1", new Date("2018-12-01"), new Date("2018-12-31"), 10.00, "Ein Hinweis",
    'Test', "12345678", 180, 13500, 10, 170, 5940, 1000, 6940, 0.0, 0.0, 0.0, 13500));
    this.financialItems.push(new FinancialItem("Nr.2", new Date("2018-12-01"), new Date("2018-12-31"), 10.00, "Ein Hinweis",
    'Test', "12345678", 180, 13500, 10, 170, 5940, 1000, 6940, 0.0, 0.0, 0.0, 13500));
    this.financialItems.push(new FinancialItem("Nr.3", new Date("2018-12-01"), new Date("2018-12-31"), 10.00, "Ein Hinweis",
    'Test', "12345678", 180, 13500, 10, 170, 5940, 1000, 6940, 0.0, 0.0, 0.0, 13500));
  }

现在在执行代码并打开选项卡时,我会看到VirtualScroller-但不会立即看到alle元素。但是,该元素足够长,因此所有元素都应该存在。

这是视图:

enter image description here

最后一个元素不可见,但已存在并已呈现。当我使用ng serve时,我可以看到该元素。

现在滚动时会显示不可见的项目,但是底部(现在不可见的部分)仍然不可见。当我移除项目周围的p-tabView时,它是完全可见的。我怎样才能解决这个问题?我想将其保留在选项卡视图中。

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决该问题的方法。关键是仅在选择选项卡时使用ngIf加载虚拟滚动。 对于您的示例,这意味着:

<p-tabView (onChange)="changeTab($event)" class="main-tab-view" [style]="{'heigth':'100%'}">
<p-tabPanel header="TestVS">
    <app-virtual-scroller *ngIf="scrollTabSelected"></app-virtual-scroller>
</p-tabPanel>

在组件中:

changeTab(ev) {
  this.scrollTabSelected = ev.index === 1;
}

将索引更改为包含虚拟滚动条的选项卡的索引。如果虚拟滚动条位于第一个选项卡中,我尚未测试解决方案。

相关问题