【发布时间】:2022-11-23 22:03:31
【问题描述】:
如何为对象创建新的主题,或者我必须只使用行为主题?
public myObject: Subject<any> =
new Subject();
我设置数据:
myObject.next({id: 1, name: 'Jack'})
并像这样订阅这个主题:
myObject.subscribe((res)=> console.log(res))
但是我无法获取该主题的数据
【问题讨论】:
如何为对象创建新的主题,或者我必须只使用行为主题?
public myObject: Subject<any> =
new Subject();
我设置数据:
myObject.next({id: 1, name: 'Jack'})
并像这样订阅这个主题:
myObject.subscribe((res)=> console.log(res))
但是我无法获取该主题的数据
【问题讨论】:
尝试将其更改为 BehaviorSubject
public myObject: BehaviorSubject<any> =
new BehaviorSubject();
【讨论】:
[...] 或者我必须只使用行为主题?
不仅如此,它还会对您的示例有所帮助。
BehaviorSubject有一个状态,只要你订阅它,它就会立即发出状态,例如// set initial state in constructor. public myObject: Subject<any> = new BehaviorSubject({id: 1, name: 'Jack'}); // calling next will also change the state myObject.next({id: 2, name: 'Jack-2'}); // emits the state immediately at subscribe. myObject.subscribe((res)=> console.log(res))另一方面,普通的
Subject不存储任何发射值。当你打电话给myObject.next({id: 1, name: 'Jack'})而没有人订阅myObject时,发射就会丢失。
【讨论】:
Subject 和 BehaviorSubject 之间的区别很微妙,并且与订阅时刻有关。
Subject 只会从订阅的那一刻起获得新值。BehaviourSubject 将在订阅时提供最后一个值和所有新值。
还有一个 ReplaySubject 将在订阅时提供所有以前的值和所有新值。
【讨论】: