如何获取上次发布的Observable

问题描述:

我创建了一个基本上用一些用户信息设置对象的Angular服务。当我更改用户时,该服务会发出可观察的事件,并由一些兄弟组件捕获以更新信息。问题是我第一次设置数据时,还没有人订阅,所以我得到一个未定义的值。我已经阅读了关于使用publish()或share()将观察值转换为'hot'的内容,但我对RxJS很新,但我仍然不明白它是如何工作的,所以我有点迷路。如何获取上次发布的Observable

服务码(相关部分):

getFwcUser() : Observable<FwcUser> { 
    return this.subjectFwcUser.asObservable(); 
} 

setFwcUser(user : FwcUser) { 
    this.fwcUser = user; 

    this.subjectFwcUser.next(this.fwcUser); 
} 

注:FwcUser是与一些用户字段的接口。我在按钮处理程序中运行setFwcUser以选择用户。

已故订户(组分代码):

ngOnInit() { 
    this.fwcUserService.getFwcUser() 
    .subscribe(
     (user : FwcUser) => { console.log('Received: ', user); this.fwcUser = user; } 
); 
    [......] 
} 

始终打印:“收到的:未定义。 注意:组件位于'* ngIf =“fwcUser”'内部,所以当我从同级组件调用'setFwcUser'时它被加载。

我怎样才能让这个组件读取丢失的值?

另外,有人可以推荐一个很好的资源来了解初学者的RxJS吗?我正在阅读Angular4上的几本书,但没有一本清楚地解释它...

谢谢!

BehaviorSubject就是这里的答案。 BehaviorSubject并不是一个标准主体(Observable),它只是在发送值时发出值,而是在subscribe()上发出最后一个值。您还可以使用BehaviorSubjects getValue()方法手动获取上一个值。

有关以下代码的一点注意事项是BehaviorSubject声明中的null块表示初始化时BehaviorSubject的初始值。你可以离开它,或者预先填充一个值。

服务

编辑:修正了几个打字错误的。

fwcUser: BehaviorSubject<FwcUser> = new BehaviorSubject<FwcUser>(null); 
fwcUser$ = this.fwcUser.asObservable(); 

// Set the value of the fwcUser 
updateFwcUser(user) { 
    this.fwcUser.next(user); 
} 

组件

// Subscribe to the BehaviorSubject 
ngOnInit() { 
    this.fwcUserService.fwcUser$.subscribe(_fwcUser => { 
     this.fwcUser = _fwcUser 
    } 
} 

// Get the current (previously emitted) value manually 
getFwcUser() { 
    this.fwcUser = this.fwcUserService.fwcUser.getValue(); 
} 
+0

感谢您的快速回复!那么setFwcUser()函数是怎么样的呢?应该是这样的:? 'this.fwcUser = new BehaviorSubject(user);' – Fel

+0

我更新了我的答案,以更新BehaviorSubject的最佳方式。您需要在服务中添加一个接受您想要发出的新值的函数,然后使用'next()'函数推出新值。 – joshrathke

+0

再次嗨!对不起,我以前无法测试它,我一直很忙......我按照你的指示,它完美的工作!非常感谢你 :) – Fel