如果已发出新数据,如何更新已转换为信号的可观察量?

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

我正在尝试利用 Angular 的一些新的 Signal 反应性。我正在遵循这个工作流程,并将我的一个可观察量转换为信号,然后将其读取并显示在我的屏幕上。

https://angular.dev/guide/signals/rxjs-interop#tosignal

工作示例

** T.S **

    response_obs$ =
            this.apiService.getResponse();

    response_signal:  Signal<any> = toSignal(response_obs$,  {initialValue: 0})


** HTML **

    <div *ngIf="response_signal()">
      <div class="item" *ngFor="let item of response_signal().items ">
          <label>{{ item.name }}</label>
          <small>{{ item.website }}</small>
      </div>
    </div>

这一切都可以正常工作并打印。我们使用 toSignal() 函数替换了异步管道。

接下来我要努力实现的是反应性。当我在应用程序的其他部分发布到此 API 时,可观察到的数据将发出新数据,如果我刷新网页,则会出现该数据,但更改未注册。

可观察的更新可以通过事件发射器触发,Angular Signals 工作流程中是否有可以在此处使用的工具?

javascript angular asynchronous rxjs angular-signals
1个回答
0
投票

Angular 的 Signals 库在 Angular 13 中引入,提供了一种以更简洁、更高效的方式处理反应式数据的方法。但是,对于当可观察值因事件发射器而发生变化时更新信号的特定用例,您可以使用角度信号实现反应性。为了让您的 Signal 对事件发射器触发的底层 observable 的变化做出反应,您可以使用 RxJS 中的合并运算符将原始 observable 与代表事件发射器的 observable 组合起来。操作方法如下: 1. 像之前一样定义您的

response_obs$
observable:

response_obs$ = this.apiService.getResponse();
  1. 为事件发射器创建一个可观察对象。您可以通过创建主题并在事件发生时发出值来做到这一点:

    私有 updateEventEmitter = new subject();

//触发更新事件的方法

triggerUpdate() {
  this.updateEventEmitter.next();
}

// 订阅事件发射器 observable

updateEvent$ = this.updateEventEmitter.asObservable();
  1. 使用合并运算符合并原始的 response_obs$ observable 和 updateEvent$ observable。这将创建一个新的可观察量,每当原始可观察量发出数据或事件发射器发出值时,该新可观察量就会发出。

    combinedObs$ = 合并( this.response_obs$, this.updateEvent$.pipe(switchMap(() => this.apiService.getResponse())) );

  2. combinedObs$
    可观察量转换为信号,就像之前所做的那样:

    response_signal: Signal = toSignal(this.combinedObs$, {initialValue: 0 });

现在,每当您调用

triggerUpdate()
时,它都会触发事件发射器,而事件发射器又会使用 this.apiService.getResponse() 中的新数据更新
combinedObs$
可观察对象。信号将对组合Obs$ 中的更改做出反应,并在 HTML 模板中显示更新的数据。在 HTML 模板中,您不需要进行任何更改,因为您已经使用
response_signal()
函数来显示数据,并且它将自动对信号中的更改做出反应。

© www.soinside.com 2019 - 2024. All rights reserved.