第一种情况:
- 计算ngIf表达式.它订阅了可观察对象,并且评估为null.因此,由于ngIf表达式是虚假的,因此不对[result]表达式进行求值.
- 可观察对象发出,并且ngIf表达式变为真.因此,对[结果]表达式进行了评估.它自己的异步管道订阅了Cold Observable,后者发送了另一个请求,并求值为null,因此将其作为输入传递给组件.
第二种情况:
- 计算ngIf表达式.它订阅了可观察对象,并且评估为null.因此,由于ngIf表达式是虚假的,因此不对[result]表达式进行求值.
- observable发出,并且ngIf表达式变为true.因此,对[结果]表达式进行了评估.它自己的异步管道订阅了hot observable,后者立即重播上一次发出的内容,并且不再发送请求.因此,将表达式的值计算为非null值,并将其作为输入传递给组件.
比使用shareReplay更好的解决方案是将异步管道的结果存储在变量中并使用它:
A better solution than using shareReplay would be to store the result of the async pipe in a variable and use it:
<some-component
*ngIf="someColdObservable$ | async as result"
[result]="result"
></some-component>