Angular 角度行为Subject订阅只触发一次
我有一个带有布尔属性的角度服务,名为must\u checkout。我的服务还包含一个名为可观察的\u必须\u结帐的属性,它是一个查看必须\u结帐的行为主体 然后,在我的组件中,我订阅了可观察的\u必须\u签出 这将起作用,并且组件在第一次“必须”签出更改时收到事件。但是,这只触发一次,对必须签出的后续更改不起作用: 服务:Angular 角度行为Subject订阅只触发一次,angular,typescript,rxjs,observable,Angular,Typescript,Rxjs,Observable,我有一个带有布尔属性的角度服务,名为must\u checkout。我的服务还包含一个名为可观察的\u必须\u结帐的属性,它是一个查看必须\u结帐的行为主体 然后,在我的组件中,我订阅了可观察的\u必须\u签出 这将起作用,并且组件在第一次“必须”签出更改时收到事件。但是,这只触发一次,对必须签出的后续更改不起作用: 服务: import { Injectable, Input, Output } from '@angular/core'; import { BehaviorSubject }
import { Injectable, Input, Output } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
export class OrderingService
{
must_checkout: boolean;
observable_must_checkout = new BehaviorSubject<boolean>(this.must_checkout);
constructor([...])
{
this.observable_must_checkout = new BehaviorSubject<boolean>(this.must_checkout);
}
ChangeSomething()
{
console.log("changing the value here...");
this.must_checkout = true;
}
}
我没有看到对next()的调用,而next()就是向BehaviorSubject的当前订户激发新事件的方式。你在找这样的东西
ChangeSomething()
{
console.log("changing the value here...");
this.observable_must_checkout.next(true);
}
此外,您不需要在构造函数中初始化主题,因为您只需在上面几行进行初始化:
observable_must_checkout = new BehaviorSubject<boolean>(this.must_checkout);
constructor([...])
{}
observable\u must\u checkout=新行为主体(this.must\u checkout);
构造函数([…])
{}
你就快到了。创建BehaviorSubject时,它使用值must\u checkout
作为初始值,然后将其丢弃。这意味着对must\u checkout
的任何更改都不会对您的可观察数据产生任何影响。这与你正在做的事情相当。将此代码复制并通过此处查看mustCheckOut
中的更改如何不发出新信号
我希望这对你有帮助。如果你需要更多的澄清,请告诉我。进一步阅读可在此处找到:
我也有同样的问题,但原因不同
这是我的声明
private clients: BehaviorSubject<ClientSummary[]> = new BehaviorSubject(undefined);
public clients$: Observable<ClientSummary[]> = this.clients.asObservable();
加载页面时,observable将触发以下日志
undefined
但是,当在行为主体上调用next时,可观察对象没有再次激发
this.clients.next([/* some clients*/]);
你能看到问题吗?
这很微妙,我花了一段时间才找到
解决方案
更新初始值
private clients: BehaviorSubject<ClientSummary[]> = new BehaviorSubject([]);
private客户端:BehaviorSubject=newbehaviorsubject([]);
我不知道为什么,但是有了这个更改,每次调用行为主题
时,observable not都会更新
至于我为什么一开始就没有定义?
可能是复制粘贴
this.clientService.clients$.subscribe(clients => {
// do something with clients
console.log(clients);
});
undefined
this.clients.next([/* some clients*/]);
private clients: BehaviorSubject<ClientSummary[]> = new BehaviorSubject([]);