首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理带有多个订阅的ngrx let作为ng-container中的ng-container?

如何处理带有多个订阅的ngrx let作为ng-container中的ng-container?
EN

Stack Overflow用户
提问于 2020-10-29 14:05:09
回答 1查看 513关注 0票数 3

我开始使用ngrx let来使用普通对象。

问题是,当我在我的组件中使用了很多可观察对象时,我最终得到了看起来很糟糕的代码(ng-container中的ng-container ...):

代码语言:javascript
复制
<ng-container *ngrxLet="obs1$ as obs1">
 <ng-container *ngrxLet="obs2$ as obs2">
  <ng-container *ngrxLet="obs3$ as obs3">
   <ng-container *ngrxLet="obs4$ as obs4">

    <app-comp [data]="obs1" ..>..</app-comp>
    <app-comp2 [data]="obs1" [data2]="obs3"..>..</app-comp2>
    <app-comp3 [data]="obs1" ..>..</app-comp3>
    <app-comp4 [data]="obs1" ..>..</app-comp4>
    <app-comp5 [data]="obs4" [data11]="obs1" ..>..</app-comp5>
    <app-comp6 [data]="obs2" ..>..</app-comp6>
    <app-comp7 [data]="obs3" ..>..</app-comp7>
  </app-number>
</ng-container>

有没有更好的方法来处理这种语法?

EN

回答 1

Stack Overflow用户

发布于 2020-10-29 14:32:19

您可以使用combineLatestzipforkJoin等RxJS函数在控制器中组合可观察对象。每一个都有一个特定的机制,你可以在here上找到它们之间的区别。

使用combineLatest的插图

控制器

代码语言:javascript
复制
combined$: Observable<any>;

ngOnInit() {
  this.combined$ = combineLatest(
    obs1$.pipe(startWith(null)),
    obs2$.pipe(startWith(null)),
    obs3$.pipe(startWith(null)),
    obs4$.pipe(startWith(null))
  ).map(([obs1, obs2, obs3, obs4]) => ({  // <-- `map` emits a user-friendly object
    obs1: obs1,
    obs2: obs2,
    obs3: obs3,
    obs4: obs4
  }));
}

模板

代码语言:javascript
复制
<ng-container *ngrxLet="combined$ as data">
  <app-comp [data]="data?.obs1" ..>..</app-comp>
  <app-comp2 [data]="data?.obs1" [data2]="data?.obs3"..>..</app-comp2>
  <app-comp3 [data]="data?.obs1" ..>..</app-comp3>
  <app-comp4 [data]="data?.obs1" ..>..</app-comp4>
  <app-comp5 [data]="data?.obs4" [data11]="data?.obs1" ..>..</app-comp5>
  <app-comp6 [data]="data?.obs2" ..>..</app-comp6>
  <app-comp7 [data]="data?.obs3" ..>..</app-comp7>
</ng-container>

然而,有一个警告。除非每个源可观测对象至少发射一次,否则combineLatestzip不会开始发射。我们可以使用startWith操作符来强制执行它,如下所示。但是,您需要确保第一个值(这里是null)不会影响数据绑定。当然,您可以将*ngrxLet替换为*ngIf,以避免发出null,但那样您就会失去*ngrxLet的好处。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64585823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档