问题标签 [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.
angular - Subject.subscribe 未在 ngOnInit 中触发
我已经在我的service.ts
中定义了主题onEditItem()
indetail.component.ts
传递了 id in 的值,.next()
并且在new.component.ts中订阅了主题
但是订阅不起作用。订阅ngOnInit
在new.component.ts中完成
id 的值传入成功,onEditItem()
但是订阅不起作用。我试过在订阅中进行 console.log 检查。但是控制台中没有打印任何内容。
在details.component.html
在details.component.ts
在contactService.ts
在new.component.ts
我希望在中定义的表单new.component.html
应该使用详细信息组件中的值进行初始化,但订阅在ngOnInit
.
angular - .subscribe() 方法中所做的更改未反映在它或模板中
我正在使用主题向基本电话簿应用程序添加编辑功能。我在订阅回调内部对组件类变量所做的更改不会反映在它或模板中。
我已经尝试了以下问题的答案中列出的解决方案: Angular 2 View will not update after variable change in subscribe
在 service.ts 中:
在 details.component.ts(数据在 fu 上传递的地方):
在 edit-component.ts(在 ngOnInit 中):
控制台上的输出:
预期结果:
javascript - RXJS 的 Subject inside Function
请,我需要帮助我的代码不起作用:
为什么testSubject.next('test');
根本不开火?谢谢
angular - Rxjs 行为主题未使用 ionic 4 和 angular 7 更新 UI 上的数据
我在服务中定义并初始化了一个 BehaviourSubject 类型的数组,并在使用另一个函数对其进行编辑时对其进行更新。但是,UI 上显示的结果不是新编辑的数组,而是已成功将更改应用到服务器上的外部数据库。
我已经尝试了许多在线解决方案,但仍然无法正常工作。
这是名为“ServicesService”的服务中数组初始化的代码。
这是服务中将数组作为可观察对象访问的函数;
}
这是服务中用于删除数组中的一个元素的函数。首先,它在服务器上删除它而不是在本地阵列上。
这是我订阅 BehaviourSubject 以跟踪任何更改的另一个组件中的代码;
我在服务中调用 delete 方法来使用这个函数删除一个元素;
我所期望的是,一旦我从数组中删除了一个元素,它也应该从 UI 的列表中删除,而无需刷新页面或重新访问页面,但这似乎不起作用。
我将感谢您对如何解决此问题的帮助。
angular - 为什么我无法在 Angular 中订阅来自不同模块的 observable(同时 setter 也可以)
我正在尝试跨模块工作 - 我在模块中编写了一个服务
共享服务
我从一个并行模块调用它,我可以通过构造函数调用服务来设置当前参数。但是,getter 似乎不适用于同一个模块。订阅似乎不起作用。它似乎返回一个可观察的,但我无法订阅它。
我的组件.ts
日志第 1 行在第一行返回一个 observable 但是,订阅什么也不返回,日志 2 和 3 是空的。
我尝试从不同的模块进行相同的订阅,getter 也可以。为什么它没有在 getter 中被这个组件拾取?
angular - 从订阅者 Angular 获取数据的问题
嗨,我是 angular 新手,正在学习 observable 和 Subject 的概念。我的理解是 observable 是其他代码可以订阅的事件发射器,Subject 既可以订阅也可以发射数据。我尝试了下面的代码,我检查以毫秒为单位的时间是否均匀,并基于此我发出成功和失败。基本上我已经创建了一个随机的成功和失败方法。问题是每当出现错误时,控件就会移动到错误块,但它永远不会打印成功或进入成功块。我不确定我做错了什么。如果您可以向我指出任何有助于消除我知识空白的博客或文档,请告诉我。提前致谢。
javascript - Angular RXJS 根据值重试任务
好的,所以我有一个服务来检查是否已加载特定的 3rd 方 JS 插件。我想监听它何时进入 DOM,同时它处于未定义状态。我怎么做?到目前为止,我已经尝试使用一个主题并定期重试,但我无法让它工作:
然后在组件中:
我的意图是检查 API 元素是否已加载,如果没有在 2 秒内重试,但这不起作用,有人可以帮忙吗?
angular - 如何正确使用异步管道更新 Angular 7 中的模板
我有一个服务方法,它获取虚拟数据并返回一个 observable。
在另一个服务中,我使用 switchMap 运算符将用户 ID 映射到我的loadDummyData
方法中。
另一个服务
然后在我的getData component
在中getData component
,我对 dummyService 方法进行了 2 次调用,
- 调用 anotherService => loadDummyData() (使用 switch map 加载数据)
- 调用 dummyService => loadDummyData() 直接传递 Id 并订阅。
两次数据都记录在控制台中并且似乎又回来了。但是,在我的模板中,async |
没有显示数据。在第二次调用以获取数据时,该loadProfile
变量也变得未定义。
模板
我在这里想念什么?
angular - 如何清除 RxJS 主题中的先前值并仅发送最新值?
我的 Angular 应用程序中有一个网格,其中行中有按钮,单击按钮时,它会打开相应的弹出窗口。我创建了一个具有BehaviourSubject
ie属性的服务popupEventSubject$
。
我面临的问题是,当我在行中打开和关闭一个弹出窗口,然后打开另一个弹出窗口时,前一个弹出窗口会在当前弹出窗口旁边打开。我怀疑的问题是,由于Subjects
inRxJS
发出先前的值(订阅时),BehaviourSubject
在我的情况下是维护先前事件的队列,当调用订阅时,它会显示队列中的所有事件,即打开先前的弹出窗口.
那么,有没有办法清除正在创建的“队列”?
理想情况下,我正在寻找我BehaviourSubject
的工作方式AsyncSubject
,我尝试替换BehaviourSubject
为,AsyncSubject
但它似乎没有发出初始事件。我尝试this.popupEventSubject$.emit(null)
在我的主题服务的构造函数中使用AsyncSubject
,但它仍然无法订阅。
我想在弹出窗口关闭时取消订阅该主题,但由于该主题不再可用,因此不会打开其他弹出窗口。
另外,我想避免null
每次在发出事件以清除queue
.
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,我不会收到通知