html - 平滑加载消息 Angular 8

标签 html angular typescript angular8

我正在使用 Angular 8 编写一个聊天应用程序,这就是我想要实现的目标: 我的对话组件代表两个用户之间的聊天,在启动后会获取一页最后的消息,其中包含 10 条消息。包含这些消息的 div 向下滚动到最后一条消息。当用户向上滚动并到达某个点时,将加载下一页。两个数组连接起来,用户现在可以看到 20 条消息。这是我到目前为止所拥有的:

HTML:

<div>
  <div #scrollMe [scrollTop]="scrollMe.scrollHeight" (scroll)="onScroll($event)" style="overflow-y: scroll; height: 400px;">
    <ul>
      <li *ngFor="let message of messages?.reverse()">
    </ul>
  </div>
</div>

打字:

loadMessages(page: number, itemsPerPage?: number) {
    this.messageService.getMessageThread(page, itemsPerPage || 10)
      .subscribe((res: PaginatedResult<MessageThread>) => {
        if (this.messages == null) {
          this.messages = res.result.messages;
        } else {
          this.messages = this.messages.concat(res.result.messages);
        }
      });
  }


onScroll(event) {
    if (event.target.scrollTop < 100) {
      if (this.pagination.currentPage >= this.pagination.totalPages) {
        return;
      }

      this.loadMessages(++this.pagination.currentPage);
    }
  }

它有效,但问题是,当我加入这两个数组时,我的滚动条跳得非常难看,并且由于我按住滚动条,它保持在同一位置并继续加载下一页。总的来说,我对 Angular 和前端都很陌生,所以我感觉我错过了一些东西。我试图找到任何现成的解决方案,但找不到。任何帮助将不胜感激。

请注意,我不想使用 JQuery。

最佳答案

几件事:

首先,我们需要一个加载标志:

loading = false;

然后我们让 loadMessages 返回一个可观察对象而不是处理结果:

  loadMessages(page: number, itemsPerPage?: number) {
    this.loading = true;
    return this.messageService.getMessageThread(page, itemsPerPage || 10);
  }

一个单独的方法handleResponse通过将loading设置为false并连接消息来处理响应。

然后我们可以考虑滚动处理程序中的请求延迟,并使用加载标志来防止多个请求:

  onScroll(event) {
    // get the scroll height before adding new messages
    const startingScrollHeight = event.target.scrollHeight;
    if (event.target.scrollTop < 100) {
      if (this.pagination.currentPage >= this.pagination.totalPages) {
        return;
      }

      else if (!this.loading) {
        this.loadMessages(this.pagination.currentPage).subscribe((res) => {
          this.handleResponse(res);
          // using setTimeout lets the app "wait a beat" so it can measure
          // new scroll height *after* messages are added
          setTimeout(() => {
            const newScrollHeight = this.scrollDiv.nativeElement.scrollHeight;
            // set the scroll height from the difference of the new and starting scroll height
            this.scrollDiv.nativeElement.scrollTo(0, newScrollHeight - startingScrollHeight);
          });
        });
      }
    }
  }

Stackblitz (已更新)

关于html - 平滑加载消息 Angular 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59310607/

相关文章:

javascript - 将目标空白添加到 JavaScript 生成的链接

angular2 - DatepickerConfig 没有服务提供商

javascript - 重新映射 json 对象并将它们推送到一个数组中

angular - jhipster 客户端将实体过滤器传递给服务器端?

html - typescript 错误 类型 'HTMLElement' 上不存在属性。任何

html - 当屏幕尺寸改变时,用内部的 slider 调整 DIV 的大小

html - 伪造CSS表格布局支持colspan

javascript - 有什么方法可以检测 React JS 中的中间点击吗?

angular - 错误 : SyntaxError: Unexpected strict mode reserved word(…).。

javascript - 从列表中删除选定的选中项 - Angular 2+/Ionic 2