带有附加元素的无限滚动angular2

Infinite scroll with appending elements angular2

我想实现无限滚动,其关键特性是可以添加新元素而不是实现列表的全部内容。

目前我尝试使用 ng-infinite-scroll 但由于使用 ngFor 它每次都从头开始呈现整个列表。

<div style="width: 750px;">
<div class="posts-list" 
infinite-scroll 
[infiniteScrollDistance]="2" 
[infiniteScrollThrottle]="300" 
(scrolled)="onScrollDown()">
    <post-component *ngFor="let item of array" [dataHref]="item"></post-component>
</div>    

这种方法导致元素获取它们的数据(导致不可接受的延迟)。我想是否可以通过路由器模块中的子组件来实现这样的事情(但这听起来很糟糕,因为我没有有限的帖子列表)。

有人知道如何添加新元素而不重复已经呈现的元素吗?

创建无限滚动的一种方法如下。

1 - 将滚动事件添加到您的目标 div。 (跟踪滚动事件,并在满足条件时创建一个 post 组件。) 2 - 在 div 中添加 ng-template(在 DOM 中注入模板)

HTML

<div style="width: 750px;">
   <div class="posts-list"(scroll)="onScroll($event)">
      <ng-template #post></ng-template>
   </div>
</div> 

在您的 ts 文件中,添加一个函数,该函数将在您滚动时根据条件动态创建组件(例如,目标的 80% div)

TS

@ViewChild('post') element: ElementRef;

constructor(private viewContainerRef: ViewContainerRef, private componentFactoryResolver: ComponentFactoryResolver){}

onScroll($event): void {
  // apply condition eg. when 80 % of div is scrolled
  if(conditionIsMet){
    this.loadPostComponent();
  }
}

loadPostComponent() {
  let postComponent = this.componentFactoryResolver.resolveComponentFactory(PostComponent);
  let componentRef = this.element.createComponent(postComponent);
  (<PostComponent>componentRef.instance).data = post.data;
}

希望对你有帮助。