【问题标题】:Don't receive data from Subject.next()不接收来自 Subject.next() 的数据
【发布时间】:2018-10-08 19:13:14
【问题描述】:

我有一个角度应用程序,它使用 ngx-formly(动态表单)和一个正式类型(选择),其中我有一个 subscribe()。在组件中,formly 表单使用 Observable 为 formly 类型定义并动态创建。

在组件中我有一个Subject 和按钮,产生一个next(),formly 类型不接收数据(也没有接收完整)。 组件本身中的 subscribe() 有效。

Subject 更改为BehaviorSubject<number>() 我收到了formly 类型的一次性数据,但next() 上没有更多数据。

该代码用于步进器/向导,更改为下一步,此步骤中的所有选择都应重新加载它们的选项。

可以在此处找到 100% 有效的 stackblitz 示例:https://stackblitz.com/edit/angular-9ts63k?file=src%2Fapp%2Fapp.component.ts

我对 rxjs 有很好的了解(使用 rxjs 和 ngx-store 两年;我到目前为止是专家),但是我完全被困住了,所以任何想法为什么 rxjs 与 stackblitz 中的设置相同欢迎示例在我的应用程序中不起作用。

  • “@angular/core”:“^6.1.9”
  • “rxjs”:“^6.3.3”
  • 没有 rxjs-compat

【问题讨论】:

  • one time data in the formly type 是什么意思?在演示中,当我点击 next X 时,它会在控制台中显示一些输出。
  • 我无法重现您描述的行为。如果我用this.stepSelectedXXX$ 替换所有出现的this.stepSelected$,它会产生与以前相同的行为。
  • stackblitz 示例 100% 有效,我的应用程序中的相同设置不起作用,但找不到原因,因此欢迎提出任何想法。
  • 它到底在哪里不起作用?您应该能够使用控制台日志来找出答案。 StackBlitz 很好,一旦切换到BehaviorSubject。也许将 stackBlitz 复制粘贴回您的应用程序。

标签: angular rxjs angular-formly subject


【解决方案1】:

您尝试使用的架构似乎与ngrx/effects (Find the Github Here) 的架构非常相似。所以现在你的代码的问题是你订阅了主题stepSelected$,而不是你只是管道它并在上面应用switchMap运算符。在订阅之前,您无法从 observable 接收值。

this.stepSelected$.subscribe(value => {
  this.getSports(value);
});

您必须执行类似的操作才能从主题中获取价值,然后调用 API。

【讨论】:

  • 不,这是切线,问题是形式上没有订阅传递给它的可观察对象。他对 switchMap 的使用是正确的。如果您查看ngOnInit,您将看到他的订阅使用情况。据我了解,问题是第 26 行。
  • 订阅在 core/select.type.ts 中完成(除了组件/ngOnInt 中的另一个订阅)。 stackblitz 示例 100% 工作,按下按钮并查看更改的选项。但是为什么它在我的应用程序中不起作用。
【解决方案2】:

我找到了罪魁祸首。该应用程序使用动态表单并在服务中使用 cloneDeep 来复制表单字段定义(被忽略)。到目前为止,该应用程序仅使用了 Observable 的返回,而没有使用有效的 Subject。现在使用额外的 Subject 事情不再起作用,检查 Observable 流显示一个已关闭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多