Angular/Rxjs 管道异步不适用于 ssr?

fob*_*oss 5 rxjs server-side-rendering angular-universal angular nestjs

我在 SSR 上运行的异步管道有问题。没有错误,只有无限循环(似乎服务器正在等待 observable 被解析)。

我在用:

  1. @nestjs/ng-universal
  2. 角 9
  3. 火力基地
  4. 接收器

像这样的简单案例有效:

<p>{{ observable | async }}</p>
Run Code Online (Sandbox Code Playgroud)

但是使用结构指令不起作用:

如果

<p *ngIf="(observable$ | async) > 5">{{ observable$ | async }}</p>
Run Code Online (Sandbox Code Playgroud)

恩福

<p *ngFor="let item of items | async">{{ item }}</p>
Run Code Online (Sandbox Code Playgroud)

使用 async 是一个很好的做法,因为它会避免手动取消订阅以避免组件销毁时内存泄漏。但是,使用手动取消订阅有效。

更新 08/06/2020

当我在http://localhost:4200之后添加 index.html 时,应用程序会加载

异步在模板中是这样的:

<ng-container *ngIf="currentUser$ | async; else loadingUser">
Run Code Online (Sandbox Code Playgroud)

并且 currentUser$ 是在ngOnInit组件的方法中设置的:

  ngOnInit(): void {
    this.currentUser$ = this.authService.currentUser$;
  }
Run Code Online (Sandbox Code Playgroud)

更新 16/06/2020

当我们在组件中删除所有 OnPush 检测策略的使用时,即使在结构指令中使用异步,SSR 模式也能工作。

所以这似乎表明在结构指令中使用带有异步的 OnPush TOGETHER 在 SSR 模式下不起作用。

笔记

我们nest.js用于 SSR/Universal。

Min*_*hah 0

当我们使用 OnPush 更改检测策略时,我们基本上会在我们特别需要时检测到更改。

仅当我们更改变量的引用而不仅仅是值时,才会检测到 OnPush 更改。

所以在这里你的两个概念发生了冲突。要么更改检测策略,要么更改currentUser$可观察值的引用。

我建议你应该改变这里的检测策略。

  • 谢谢,但我了解更改检测的工作原理,包括默认值和 OnPush 值。我们确实将检测策略更改为默认(即自动),然后 SSR 模式就可以工作了。但是当 OnPush 和异步管道在同一个项目中时,SSR 模式不起作用。 (2认同)