Angular Signals:无需取消订阅的 api 调用

问题描述 投票:0回答:1

我很困惑是否可以在 Init 组件上进行 api 调用,并且每次当父级从子级(分页组件)获取事件时,使用新的 pageSize 和 pageNumber 调用 api 并分配此数据。主要问题是我想避免手动取消订阅和效果(因为不建议使用它来更改状态)。也许此时没有其他取消订阅的选项。我的下一个问题是,是否更建议使用模型而不是输入和输出信号?

子组件 ts

  rows = input.required<number>();
  pageChanged = output<number>();
  onPageChange(event: PaginatorState) {
    this.pageChanged.emit(event.rows!);
  }

父组件html

<app-paginator
  [rows]="pageSize()"
  (pageChanged)="onPageChange($event)"
  [totalRecords]="dataResponse()?.totalElements || 0"
  [(paginationData)]="pagination"
  [rowsPerPageOptions]="allowedNumbersOfRecordOnOnePage"></app-paginator>

父组件ts

    pageNumber = signal<number>(0);
      pageSize = signal<number>(100);
    //apiService.getData(arg1,arg2) return observable
 dataResponse= toSignal(
    this.apiService.getData(this.pageNumber(), this.pageSize())
  );

  onPageChange(pageSize: number) {
    this.pageSize.set(pageSize);
// How to set data to dataResponse reactively to signal without manually unsubscribe?
    
  }
angular rxjs angular-signals
1个回答
0
投票

当您需要两种方式的数据绑定时,您可以使用模型,如果是一种方式的数据绑定,请使用

input

这里的模型更好,因为当子项更改时您触发 API,当父项更新值时您也需要更新子项。

<app-paginator
  [(rows)]="pageSize()"
  (pageChanged)="onPageChange($event)"
  [totalRecords]="dataResponse()?.totalElements || 0"
  [(paginationData)]="pagination"
  [rowsPerPageOptions]="allowedNumbersOfRecordOnOnePage"></app-paginator>

更新孩子有一个模型。

rows = model<number>();

onPageChange(event: PaginatorState) {
  this.rows.set(event.rows!);
}

现在您可以使用

computed
对更改做出反应。我们将
computed
包裹在
toSignal
内,这样您就无需处理取消订阅的问题。

pageNumber = signal<number>(0);
pageSize = signal<number>(100);
//apiService.getData(arg1,arg2) return observable
dataResponse = toSignal(computed(() => 
    this.apiService.getData(this.pageNumber(), this.pageSize()))());

onPageChange(pageSize: number) {
  this.pageSize.set(pageSize);
  // How to set data to dataResponse reactively to signal without manually unsubscribe?
}
© www.soinside.com 2019 - 2024. All rights reserved.