使用异步管道显示从应用程序状态检索到的 Observable 数据

Posted

技术标签:

【中文标题】使用异步管道显示从应用程序状态检索到的 Observable 数据【英文标题】:Use async pipe to show Observable data retrieved from the Application State 【发布时间】:2021-08-23 01:17:51 【问题描述】:

我的代码从 Application State 获取数据,然后在 component.html 中显示数据。

component.ts

myData$: Observable<IMyData>;

ngOnInit() 
   this.myData$ = this.myStore.select(fetchMyData);

   // here I get a code and I use it to dispatch a new action
   this.myStore.select(codeSelector).pipe(
      map((code) => this.myStore.dispatch(myDataAction( code: code )))
    ).subscribe();

component.html

myData$.myField

上面的代码完美运行。

现在,我不想在 component.ts 中调用 subscribe() 方法,而是在 component.htmlasync 管道/strong>,这样:

<ng-container *ngIf="myData$ | async as data">
data.myField
   

当我这样做时,component.html 中不会显示任何内容。我知道在我后面的代码中,我使用的运算符有问题。

我多次使用异步管道,但仅在调度标准操作时使用;在操作员内部调度操作时,我从未使用过它。

你能帮我理解我的错误吗?

【问题讨论】:

在地图运算符内部,您返回的是操作而不是可观察的 map((code) => this.myStore.dispatch(myDataAction( code: code ))) 嗨@Chellappanவ,我应该如何编辑我的代码? 您的subscribe() 正在订阅this.myStore.select(codeSelector)。没有它,您的商店选择器将不会返回任何内容,因为它是冷可观察的。作为回报,它不会执行您的操作,并且可能不会更新fetchMyData 正在选择的您的商店数据。顺便说一句,正如一个答案所暗示的,您应该使用 tap() 而不是 map() 嗨@FrankFajardo,谢谢你的解释。现在我知道我必须订阅“this.myStore.select(codeSelector)”才能使“this.myData$ = this.myStore.select(fetchMyData)”工作;然后我可以在模板内的“myData$”上使用异步管道。 【参考方案1】:

尝试点击操作符来获得地图的副作用

   data$ = this.myStore.select(codeSelector).pipe(
      tap((code) => this.myStore.dispatch(myDataAction( code: code )))
    )

然后在组件内部

<ng-container *ngIf="myData$ | async as data">
</ng-container>

【讨论】:

嗨@Chellapan,可能我解释得不好。如果我按照您的建议使用 subscribe(),我的代码就可以工作。我试图做的是避免使用 .subscribe() 并在模板中使用异步管道(自动订阅和取消订阅) 实际上,当使用异步管道时,您不需要订阅内部组件,您可以使用点击运算符。它会在异步管道解析时被调用 谢谢你的帮助。实际上,您编写的代码正是我在 *** 上寻求帮助之前编写的代码。差别不大:我不能做“data$ = this.myStore.select...”,因为“data$”有一个类型(正如你在我的帖子中看到的那样是“IMyData”类型),并且“ this.myStore.select..." 只返回一个字符串(我只是传递给操作)。无论如何,我认为 FrankFajardo 恰到好处:我必须订阅()到“this.myStore.select(codeSelector)”才能使整个代码正常工作。 @Matt 是的,您需要订阅才能使流程正常运行。

以上是关于使用异步管道显示从应用程序状态检索到的 Observable 数据的主要内容,如果未能解决你的问题,请参考以下文章

ExtJs 处理异步调用

将异步结果从父组件传递给子组件反应功能组件

如何使用 Swift 在 iOS 中显示从 HealthKit 中检索到的 HKDocumentSample?

在模板中使用异步管道可观察到的不适用于单个值

使用异步管道从可观察对象中读取对象字段

将检索到的对象推送到 React 中的状态只会给我带来最后一个