当我第一次打开/选择选项卡时,它会在DOM中呈现相关的组件/ html.为了提高性能,我在选项卡上放置了ngIf以仅显示活动选项卡html.所以现在Dom只显示活动标签html,但现在当我遍历其他标签并重新访问上一个标签时,它的组件/内容似乎再次渲染.我想停止第二次渲染.
注意:如果我用隐藏替换ngIf,那么它可以接受,但由于许多手表和DOM与之相关,因此性能成本很高.
实际上我的主要问题是,由于上述问题,当我导航到标签时,我的网格滚动位置每次都设置为顶部而不是它应保持在同一状态
下面是我所做的代码的一部分.
如果选项卡内容中的条件为html(仅渲染DOM中的选定选项卡)
<div class="tab-heading-outer"> <div class="tab-heading"> <ul id="ulOpenedTabs" class="nav nav-tabs main-tabs" role="tablist"> <li> <span class="ellipsis"> {{tab.Header}} </span> </li> </ul> </div> </div> <div class="tab-content" *ngIf="tab.IsSelected"> <ng-content> <!--Html goes here--> </ng-content> </div>
>使用[隐藏]隐藏组件.
>当选项卡关闭时,使用ChangeDetectorRef.detach()
从更改检测树中删除组件.
>打开选项卡以获取最新数据时,使用ChangeDetectorRef.reattach()
将更改检测添加回组件.
根据组件的实现方式,这可以解决您的性能问题.特别是如果你非常依赖于Observables和异步管道(如你所愿),如果没有检查模板的变化,就不应该进行计算.
引用detach()的文档:
Imagine the data changes constantly,many times per second. For performance reasons,we want to check and update the list every five seconds. We can do that by detaching the component’s change detector and doing a local check every five seconds.
您可以这样做,但不是基于时间,而是基于选项卡是否打开.
您所要做的就是在组件构造函数中注入ChangeDetectorRef,并将更改检测挂钩到@Input()属性:
constructor(private changeDetector: ChangeDetectorRef) {} @Input() set visible(visible: boolean) { if(!visible) { changeDetector.detach(); } else { changeDetector.reattach(); } }
现在,您只需设置[visible] =“false”或[visible] =“true”即可控制组件是否获取新数据.
您可以在ChangeDetectorRef的官方文档中找到另一个full example.