NativeScript Angular RadListView渲染速度非常慢

时间:2019-04-12 15:19:52

标签: nativescript nativescript-angular nativescript-telerik-ui radlistview

问题:

我有一个angular-nativescript应用程序,需要在网格中显示一些项目。我使用RadListView来呈现列表,并且在过去几个月中升级了我的角度,{N}和其他库依赖项之后,我注意到这些项目的RadListView渲染变得异常缓慢。我有多个“标签”,因此您可以看到不同类型的项目,每当切换“标签”时,都需要使用新的时间完全重新呈现列表。在进行一些升级(我希望可以提高应用程序性能)之前,切换选项卡即使呈现100多个项目也不会有很大的滞后。现在即使加载24个也要花费几秒钟的时间(我切换到滚动动态渲染以加快处理速度,但这还不够好)。

平台信息:

  • ios(tns ios 5.2.0,5.3.1)[Angular 7]
  • nativescript-ui-listview:6.1.0
  • nativescript-ui-core:2.0.1
  • nativescript-ui-sidedrawer:6.0.0
  • CLI:5.3.1
  • 跨平台模块:5.3.1
  • 运行时:tns-ios 5.3.1

该问题似乎与在RadListView中具有一些嵌套结构有关。我的原始代码(自从在{N},Angular,nativescript-ui的较旧版本上运行得很好以来,运行的代码没有改变:

<RadListView id="itemList" top="0" left="0" [items]="displayedInventory" separatorColor="white" [loadOnDemandMode]="loadOnDemandMode"
    (loadMoreDataRequested)="onLoadMoreItemsRequested($event)" class="gridview-wrap-tabs" dock="top" [ngClass]="{'gridview-wrap-tabs': (posLocation && posLocation.tabs)}">
    <ListViewStaggeredLayout tkListViewLayout scrollDirection="Vertical" spanCount="4" itemHeight="180" horizontalAlignment="left"
        class="inventory-list-view-inner" separatorColor="black">
    </ListViewStaggeredLayout>
    <ng-template tkListItemTemplate let-item="item">
        <StackLayout class="inventory-stack-wrap">
            <GridLayout rows="auto, *, auto" columns="auto, auto" orientation="horizontal" class="outerBox" stretchLastChild="true" (tap)="addToCart(item, true)"
                [ngClass]="{ 'portraitBox': orientation==='portrait' , 'selected-inventory-item': item.isSelected, 'empty-inventory-item': item.price < 0}">
                <Label row="0" col="0" *ngIf="item.type==='category'" height="40px" class="price-label-category" [ngClass]="{ 'portrait-category-label': orientation==='portrait' }"
                    text="Category"></Label>
                <Label row="1" col="0" verticalAlignment="top" [text]="item.name" *ngIf="item.type==='category'" class="name-label" textWrap="true"
                    [ngClass]="{ 'portrait-name-label': orientation==='portrait' }"></Label>

                <Label row="0" col="0" verticalAlignment="top" [text]="item.name" *ngIf="item.name && item.name.length <=2 0 && item.type !=='category'"
                    class="name-label" textWrap="true" [ngClass]="{ 'portrait-name-label': orientation==='portrait' }"></Label>
                <Label row="0" col="0" verticalAlignment="top" [text]="item.name.slice(0,20) + '...'" *ngIf="item.name
                    && item.name.length> 20 && item.type !== 'category'" class="name-label" textWrap="true" [ngClass]="{'portrait-name-label': orientation
                    === 'portrait'}"></Label>

                <GridLayout col="0" colSpan="2" row="1" rowSpan="2" width="100%" *ngIf="item.imageSource">
                    <Image class="inventory-image" [ngClass]="{'portrait-inventory-image': orientation==='portrait'}" [src]="item.imageSource"></Image>
                </GridLayout>
                <GridLayout width="100%" *ngIf="item.type !=='category'" row="2" col="0" colSpan="2" columns="auto, *, 10" rows="auto">
                    <Label col="1" row="0" horizontalAlignment="right" height="40px" class="price-label" [ngClass]="{ 'portrait-price-label': orientation==='portrait' }"
                        text="${{item.price | number: '1.2-2'}}"></Label>
                </GridLayout>
            </GridLayout>
        </StackLayout>
    </ng-template>
</RadListView>

作为验证RadListView渲染是否正在减慢速度的概念证明,我尝试了一个仅带有标签的嵌入项目名称的单一标签,并且渲染几乎是即时的-因此它看起来像是RadListView如何呈现子项(如StackLayout,GridLayout)的问题。我还尝试用DockLayout替换GridLayout并删除所有有角度的* ngIfs和* ngClasses(并删除了Image标签),以查看这是否可以提高性能,但似乎没有任何效果。加载24个项目仍然非常缓慢。 (对于较少的项目,加载的确会明显增加-但最初显示的内容不能少于24)

有什么想法吗?我宁愿不必降级我的angular和nativescript依赖

1 个答案:

答案 0 :(得分:0)

通过从使用 从ListViewStaggeredLayout到ListViewGridLayout。这个问题在{N}的早期版本中并没有出现,因此它似乎滞后于某个地方的更新。