问题标签 [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 投票
1 回答
2412 浏览

android - 使用 RxJava 在活动之间共享 Observable 并取消订阅

我正在尝试实现一个在我的应用程序Observable之间共享的计时器Activities。我正在一个作为 Dagger 单例的类上进行实现,我在Presenter每个不同的Activity.

我以这种方式创建了一次 Observable:

我使用以下功能从 Presenter 订阅:

我将其存储SubjectObservable每个演示者中,并调用: obs.unsubscribeOn(AndroidSchedulers.mainThread()) 取消订阅(在onPause()方法中)。我还尝试使用调度程序取消订阅Schedulers.immediate()

但是无论如何都会调用回调 X 次(其中 X 是我订阅计时器的所有演示者),所以它不是取消订阅。日志"Unsubcribed from subject!"也没有被调用。

如何正确退订每个主题?

提前致谢

编辑:

由于评论添加了更多实施细节:

这是我创建 Observable 并存储在Singleton类成员中的部分StatusManager(状态也是单例):

start(...)Presenter启动计时器调用register(...)方法之后,我从下一个演示者调用方法:

下一位主持人...

0 投票
1 回答
1705 浏览

javascript - RXJS:来自动态创建的 Observable 的单个 Observable

我正在尝试创建一个 observable(此处为 fixedObservable),它将由多个动态创建的 observable 随时间提供。每当进行订阅时,订阅者都应该从 fixedObservable 获取最新值。虽然我已经实现了,但我想知道是否有任何简单的解决方案。你可以在这里找到代码https://jsfiddle.net/dzm2t3pa/8/

谢谢

0 投票
1 回答
3739 浏览

angular - Angular:使用 RxJs/BehaviorSubject 在组件之间动态共享数据

我有两个同级组件并并排显示,比如说 Component-A 和 Component-B。

Component-A 有表单控件,一旦用户填写表单,我需要执行一些业务逻辑并将数据显示到 Component-B。

我创建了服务来共享数据。当前数据在用户进行任何更改时可用 Component-B 但它不会自动显示,我在 Component-B 上放置了“刷新”按钮,当我单击按钮时数据会显示出来。

我想要实现的是从 Component-A 到 Component-B 的流畅数据流,无需任何用户点击。由于某种原因,我无法订阅 Component-B 中的服务。

使用 @angular 版本 ~4.0.0

导航服务.ts

组分-A

HTML:

组分-B

HTML

在下面的 html 中,当用户在 ComponentA 中进行更改时,我想在 {{dataFromComponentA}} 中自动显示数据。当前,当我单击“刷新”按钮时,正在显示数据,我想避免单击此按钮。

0 投票
0 回答
463 浏览

angular - 通过主题更新属性后,Angular 2 视图未更新

我正在通过分配 style.background-color 属性将 div 的背景颜色设置为动态更新,如下所示。

在它的打字稿文件中,我分配了一个成功设置的默认颜色。稍后,我通过订阅组件文件的 ngOnInit() 生命周期内的主题来更改属性“cellColor”的值,如下所示。

在服务定义中。

从另一个组件中,我正在为这样的“cellColor”属性推送新值。

然后我像这样从组件的 ts 文件订阅主题。

属性已成功更新,但视图未更新。如上所示,我已经使用 [] 括号绑定了我的 div 的样式属性,那么为什么视图不会更新?我在这里错过了什么吗?

但是,对于同一个示例,如果我使用 Observable 进行订阅,则属性会更改并且视图也会更新。

为什么订阅 Observable 而不是 Subject 时它会起作用?

0 投票
1 回答
4414 浏览

rxjs - 一旦 Observable 的侦听引发错误,Angular 2 Subject.next 就无法工作

我对一个场景感到震惊,其中我有 Angular 服务类 (WeatherService),它执行对外部 api 的 REST 调用并在 searchWeather() 函数中获取数据。

我有一个组件 WeatherSearchComponent,它在其模板中有输入字段搜索,其中 keyup 事件绑定到组件中的函数 onSearch()。它基本上是一个 TypeAhead 输入字段。我在类和 onSearch() 函数中定义了一个主题,我正在初始化主题的 next() 函数,如下所示。

天气搜索组件:

气象服务:

我面临的问题是,如果 REST 调用失败或返回错误,我会记录它,但是一旦出现错误,Subject searchStream 生命周期就会结束,并且之后它不接受输入。我尝试处理 ngOnInit() 方法中的错误,但它不起作用。

我想知道如何处理这种情况?

0 投票
3 回答
318 浏览

javascript - 选择改变角度实现?

angularjs 有一个名为的内置指令onchanges,它会监听 select 或其他任何内容的更改,并允许您在更改时执行函数。

我多么希望这是有角度的。目前我更好地理解 ngmodel 并了解如何使用主题来实现以下目标。

我有几个城市:

和一些社区:

如果用户选择的城市不是在通向此页面的 URL 中传递的城市,(这将是默认选择的,我还没有建立它)

我需要我的应用程序访问我的数据库并使用该城市的社区重新填充社区选择选项。

所有这些我都可以做的很好,我想弄清楚的是代码,它将监听城市选择并运行一个执行上述操作的函数。

现在[ngModel] = citySelect;不会自行更新,我必须等待提交单击才能捕获值但是 [(ngModel)] = citySelect 并在主题中收听 citySelect 变量呢?

我将继续努力,但非常感谢您的建议!

0 投票
1 回答
130 浏览

angular - 在 Angular 4 中销毁指令时,观察者不会从主题中删除

当设置订阅的指令被销毁时,我在取消订阅主题时遇到问题。考虑以下 html:

toggleCollapsible指令接收并@Input()带有一个唯一 ID,该 ID 将用于识别哪些内容应该折叠/取消折叠,这是由*toggleCollapsibleContent结构指令完成的。这 2 个指令之间的通信由名为 的服务处理toggleCollapsibleService

toggleCollapsible这是该指令的一些代码。为了便于阅读,我省略了一些内容:

基本上,当单击宿主元素时,调用接收 2 个参数的服务方法,目标名称和可折叠当前是否打开。现在,我的toggleCollapsibleService

所以,基本上这只是保存将要打开/关闭的可折叠的 ID 并传递相应的值(同样,它应该打开还是关闭)。让我们看看*toggleCollapsibleContent事情变得棘手的地方:

结构指令工作正常,因此实施的那一侧没有问题。所以问题是,假设我有 HTML 片段,HomeComponent并且items集合的长度为 2。这意味着我正在创建*toggleCollapsibleContent结构指令的 2 个实例,每个实例都订阅togglerState$主题。如果通过对象进行检查console.logtogglerState$我会发现我的对象有 2 个观察者,这是预期的行为,每个*toggleCollapsibleContent.

但是,如果我转到另一条路线并渲染另一个组件等等,togglerState$主题仍然存在,当我回到加载了我的/home路线时HomeComponent,toggerState$ 会增加 2 个观察者,并且由于原始观察者仍然存在,现在我有 4 个观察者,每个*toggleCollapsibleContent指令实例 2 个,因此我的内容被复制了。

有谁知道为什么会这样?

0 投票
1 回答
2689 浏览

angular - RxJs 主题错误 - 无法读取未定义的属性“订阅”

在我返回的服务方法中,Observable我试图通过Subject操作完成来通知组件。

这就是组件监听的方式Subject

但我收到一条错误消息,指出主题(已完成)未定义。我究竟做错了什么?

0 投票
1 回答
7840 浏览

angular - 使用 Karma 的 Angular 单元测试 Observable/Subject

我正在尝试测试组件中的主题更改,但覆盖范围从未进入订阅功能。

标题栏-search.component.ts

标题栏-search.component.spec.ts

doSubmit 方法在输入文本发生更改时调用。然后,prepareSearchInput 订阅了该主题,以通过 debounce 获取下一个并输出相同的文本。

我不知道测试中的错误在哪里,但覆盖范围从未涵盖订阅代码。Internet上的示例对我没有帮助。

0 投票
1 回答
301 浏览

rxjs - 主题完成后是否安全地取消订阅其订阅者?

如果我有一个在其生命周期内发出单个值的主题的课程:

然后在另一个班级:

instanceOfMyClass.myEmitter$鉴于主题在发出后完成,我应该取消订阅吗?