问题标签 [subject-observer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3642 浏览

angular - Subject.subscribe 未在 ngOnInit 中触发

我已经在我的service.ts 中定义了主题onEditItem()indetail.component.ts传递了 id in 的值,.next()并且在new.component.ts中订阅了主题 但是订阅不起作用。订阅ngOnInitnew.component.ts中完成

id 的值传入成功,onEditItem()但是订阅不起作用。我试过在订阅中进行 console.log 检查。但是控制台中没有打印任何内容。

details.component.html

details.component.ts

contactService.ts

new.component.ts

我希望在中定义的表单new.component.html应该使用详细信息组件中的值进行初始化,但订阅在ngOnInit.

0 投票
2 回答
340 浏览

angular - .subscribe() 方法中所做的更改未反映在它或模板中

我正在使用主题向基本电话簿应用程序添加编辑功能。我在订阅回调内部对组件类变量所做的更改不会反映在它或模板中。

我已经尝试了以下问题的答案中列出的解决方案: Angular 2 View will not update after variable change in subscribe

在 service.ts 中:

在 details.component.ts(数据在 fu 上传递的地方):

在 edit-component.ts(在 ngOnInit 中):

控制台上的输出:

预期结果:

0 投票
0 回答
55 浏览

javascript - RXJS 的 Subject inside Function

请,我需要帮助我的代码不起作用:

为什么testSubject.next('test');根本不开火?谢谢

0 投票
2 回答
1381 浏览

angular - Rxjs 行为主题未使用 ionic 4 和 angular 7 更新 UI 上的数据

我在服务中定义并初始化了一个 BehaviourSubject 类型的数组,并在使用另一个函数对其进行编辑时对其进行更新。但是,UI 上显示的结果不是新编辑的数组,而是已成功将更改应用到服务器上的外部数据库。

我已经尝试了许多在线解决方案,但仍然无法正常工作。

这是名为“ServicesService”的服务中数组初始化的代码。

这是服务中将数组作为可观察对象访问的函数;

}

这是服务中用于删除数组中的一个元素的函数。首先,它在服务器上删除它而不是在本地阵列上。

这是我订阅 BehaviourSubject 以跟踪任何更改的另一个组件中的代码;

我在服务中调用 delete 方法来使用这个函数删除一个元素;

我所期望的是,一旦我从数组中删除了一个元素,它也应该从 UI 的列表中删除,而无需刷新页面或重新访问页面,但这似乎不起作用。

我将感谢您对如何解决此问题的帮助。

0 投票
2 回答
417 浏览

angular - 为什么我无法在 Angular 中订阅来自不同模块的 observable(同时 setter 也可以)

我正在尝试跨模块工作 - 我在模块中编写了一个服务

共享服务

我从一个并行模块调用它,我可以通过构造函数调用服务来设置当前参数。但是,getter 似乎不适用于同一个模块。订阅似乎不起作用。它似乎返回一个可观察的,但我无法订阅它。

我的组件.ts

日志第 1 行在第一行返回一个 observable 但是,订阅什么也不返回,日志 2 和 3 是空的。

我尝试从不同的模块进行相同的订阅,getter 也可以。为什么它没有在 getter 中被这个组件拾取?

0 投票
1 回答
58 浏览

angular - 从订阅者 Angular 获取数据的问题

嗨,我是 angular 新手,正在学习 observable 和 Subject 的概念。我的理解是 observable 是其他代码可以订阅的事件发射器,Subject 既可以订阅也可以发射数据。我尝试了下面的代码,我检查以毫秒为单位的时间是否均匀​​,并基于此我发出成功和失败。基本上我已经创建了一个随机的成功和失败方法。问题是每当出现错误时,控件就会移动到错误块,但它永远不会打印成功或进入成功块。我不确定我做错了什么。如果您可以向我指出任何有助于消除我知识空白的博客或文档,请告诉我。提前致谢。

0 投票
1 回答
166 浏览

javascript - Angular RXJS 根据值重试任务

好的,所以我有一个服务来检查是否已加载特定的 3rd 方 JS 插件。我想监听它何时进入 DOM,同时它处于未定义状态。我怎么做?到目前为止,我已经尝试使用一个主题并定期重试,但我无法让它工作:

然后在组件中:

我的意图是检查 API 元素是否已加载,如果没有在 2 秒内重试,但这不起作用,有人可以帮忙吗?

0 投票
2 回答
176 浏览

angular - 如何正确使用异步管道更新 Angular 7 中的模板

我有一个服务方法,它获取虚拟数据并返回一个 observable。

在另一个服务中,我使用 switchMap 运算符将用户 ID 映射到我的loadDummyData方法中。

另一个服务

然后在我的getData component

在中getData component,我对 dummyService 方法进行了 2 次调用,

  1. 调用 anotherService => loadDummyData() (使用 switch map 加载数据)
  2. 调用 dummyService => loadDummyData() 直接传递 Id 并订阅。

两次数据都记录在控制台中并且似乎又回来了。但是,在我的模板中,async |没有显示数据。在第二次调用以获取数据时,该loadProfile变量也变得未定义。

模板

我在这里想念什么?

0 投票
1 回答
1155 浏览

angular - 如何清除 RxJS 主题中的先前值并仅发送最新值?

我的 Angular 应用程序中有一个网格,其中行中有按钮,单击按钮时,它会打开相应的弹出窗口。我创建了一个具有BehaviourSubjectie属性的服务popupEventSubject$

我面临的问题是,当我在行中打开和关闭一个弹出窗口,然后打开另一个弹出窗口时,前一个弹出窗口会在当前弹出窗口旁边打开。我怀疑的问题是,由于SubjectsinRxJS发出先前的值(订阅时),BehaviourSubject在我的情况下是维护先前事件的队列,当调用订阅时,它会显示队列中的所有事件,即打开先前的弹出窗口.

那么,有没有办法清除正在创建的“队列”?

理想情况下,我正在寻找我BehaviourSubject的工作方式AsyncSubject,我尝试替换BehaviourSubject为,AsyncSubject但它似乎没有发出初始事件。我尝试this.popupEventSubject$.emit(null)在我的主题服务的构造函数中使用AsyncSubject,但它仍然无法订阅。

我想在弹出窗口关闭时取消订阅该主题,但由于该主题不再可用,因此不会打开其他弹出窗口。

另外,我想避免null每次在发出事件以清除queue.

0 投票
1 回答
348 浏览

angular - 在数组类型的 RxJS 主题上调用 .next() 不会通知观察者

我正在构建一个过滤器,您可以在其中按类别进行过滤,您可以通过单击类别名称旁边的复选框来选择一个类别。

所以我有一个filterComponent,它包含它自己的过滤器,然后是 a filterService,它有一个categories属性,它是 a Subject<Array<ICategory>>,这个属性用于将数据传递到productsComponent我订阅categories属性的位置。

当我想使用这种模式传递一个简单的字符串时,这个逻辑有效,但是当我想传递一个对象数组时它似乎不起作用。

在我的 filters.component.html 文件中,当复选框值发生变化时,我正在调用一个方法:

addOrRemoveCategory 方法实现如下所示:

因此,无论类别发生了什么,被添加或删除,(我在内部修改了selectedCategories数组,我用它的值调用 .next() ),我用更新的数组调用 .next() 。

问题是,当selectedCategories数组为空时,我推送到它,并用它调用 .next() ,我在订阅者函数中正确获取了值,但是如果再次执行此操作,并且我有2 个元素数组,我调用 .next(this.chosenCategories),我的订阅者方法没有得到通知。

但是,一旦我用一个空数组调用 .next() (因为我已经删除了所有以前选择的类别),我的订阅者方法就会再次收到通知。

订阅者方法:

难道我做错了什么?我必须以不同于字符串的方式处理数组吗?

结论:如果我用作 .next() 参数的数组发生变化:

  • 从长度0到1,通知我,
  • 如果长度从 1 变为 0,我会收到通知,
  • 但如果长度从 1 变为 2、或 5-6、或 8 变为 7,我不会收到通知