【问题标题】:When doing server-side sorting, pagination and filtering with Angular, how can you stop multiple calls from being made when resetting the filters使用 Angular 进行服务器端排序、分页和过滤时,如何在重置过滤器时阻止多次调用
【发布时间】:2021-12-09 13:04:25
【问题描述】:

假设我有一个表,其中的数据源按如下方式获取

const mapperFunction = ([page, dateRange]) => this.service.getListedEvents(page, dateRange);

combineLatest([this.page$, this.dateRange$])
  .pipe(
    this.retryHelper.loadAndRetryOperator(mapperFunction, this, httpErrorConsumer)
  )
  .subscribe(listedEvents => {
    this.tableData = listedEvents;
  });

然后我有一些函数链接到我的html,如下所示

pageChange(event) {
  this.page$.next(event);
}


dateChange(event) {
  this.dateRange$.next(event);
  this.page$.next(1);
}

如果我更改日期,我希望它将页面重置为第 1 页,但意想不到的效果是 API 调用被启动了两次。首先是设置 dateRange 时,其次是发生页面重置时

一种可能的解决方案是使用 switchmap,但它仍然会触发两次,并在第二次发射发生时取消第一个,但这对我来说似乎不正确。

我想我也可以使用去抖动,但这真的是最好的解决方案吗?

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    一种可能的解决方案是将要更改的所有参数放在一个对象中。这确实有意义,因为它们都是请求的一部分。

    pageChange(event) {
      this.requestModel$.next({ 
        ...this.requestModel,
        page: event
      );
    }
    
    
    dateChange(event) {
      this.requestModel$.next({ 
        ...this.requestModel,
        dateRange: event,
        page: 1
      );
    }
    

    这样您可以对请求模型进行多次更改,并且只会触发一次请求。

    【讨论】:

    • 谢谢!那工作得很好。唯一需要注意的是,我还必须创建一个名为 requestModel 的实例变量,它将当前值存储在 requestModel$ 中,我想这有点遗憾(就像代码清洁一样)。但我更喜欢这个选项,而不是我在原帖中提到的替代方案
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2017-07-24
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    相关资源
    最近更新 更多