【问题标题】:Createting observable streams - interaction between Subject and Observable创建 observable 流 - Subject 和 Observable 之间的交互
【发布时间】:2018-06-14 15:34:52
【问题描述】:

每当我们想将一些值注入可观察的流中时,我们经常使用这样的模式:

private readonly loadTriggerSubject = new Subject<any>();

private readonly loadTrigger$ = this.loadTriggerSubject.pipe(
  // operators
);

onScroll() {
  this.loadTriggerSubject.next();
}

那么在同一个组件中我们可以使用$loadTrigger$的输出流,例如:

private readonly load$ = combineLatest(
  this.limit$,
  this.loadTrigger$,
  (limit, trigger) => ({ limit, trigger }),
).pipe(
  // operators
);

onScroll()基本上是触发了整个机器,但感觉样板太多了。有没有办法明确地将 observable 与其主题分开以简化上面的代码,但在onScroll() 被触发时仍然有loadTrigger$ observable 发射??

【问题讨论】:

  • 你在哪里将 Observable 与 Subject 分开? Subject 实现了 Observable 和 Observer。 Subject 的重点是你可以调用 next 并订阅同一个对象。
  • (scroll)="loadTriggerSubject.next($event)",直接放到模板里

标签: angular rxjs observable


【解决方案1】:

如果您想在这种情况下删除主题,您可以使用Rx.fromEvent 直接从scroll 事件创建一个可观察对象。我不熟悉角度组件,但本质上这是您需要做的:

const scroll$ = Rx.fromEvent(elementBeingScrolled, 'scroll')
const load$ = Rx.combineLatest(scroll$, this.limit$)

我也很犹豫为什么您需要从scroll$limit$ 发出的值。 scroll$ 在上面的示例中发出空值,尽管我不知道 limit$ 会产生什么。如果您不需要这些值,则可以省略 (limit, trigger) =&gt; ({ limit, trigger }) 行,它只控制将哪些值传递给流的其余部分。

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2020-12-28
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多