我正在寻找一种方法,一旦用户在站点中更改了变量/属性,便会刷新以ASYNC方式公开给模板的可观察对象的集合。
这种情况很简单,我们有CSR负责的多个帐户,他们使用个人资料登录,然后有机会更改/查看其他帐户。
更改帐户后,出于自变量的考虑,我会通过BehaviorSubject发出帐户更改,并在应用程序中的其他位置订阅该事件。
在users组件中,我有一些Observables,它们表示此页面上的数据(各种数据端点),并且使用“异步”管道在模板中对其进行订阅。
当我收到确认已选择帐户的确认后,我想更新这些可观察的数据。
我已经研究过将行为主题添加到Web服务,但这是行不通的。将页面标记为更改或在页面上触发更改检查也没有效果。
供参考:
update = new BehaviorSubject<boolean>(false);
/** onInit **/
this.users$ = this.service.retrieveusers(); // returns Observable<User[]>
this.accountService.changed.subscribe(x => {
this.update.next(true);
});
this.update.subscribe(x => {
this.users$ = this.service.retrieveusers(); // this does not work because it's unaware of changes
});
我尝试根据我阅读的一些帖子将调用包装在新的BehaviorSubject中,但也没有效果;
cast(SomeType)"some other string"
以上内容也无效。
当accountService.changed被触发时,我将如何更新用户?
答案 0 :(得分:0)
您真的关闭了您,只是缺少管道和mergeMap。
/** onInit **/
this.users$ = this.accountService.changed.pipe(
mergeMap(() => this.service.retrieveusers())
)
如果我们假设change最初会发出一个值,那么上面的代码应该可以工作。如果更改不会在开始时发出一个值,那么我们需要使用RXJS发出一个初始值来触发对retrieveuser()的服务调用。有很多不同的方法可以完成此任务。
https://www.learnrxjs.io/learn-rxjs/operators/combination/startwith
/** onInit **/
this.users$ = this.accountService.changed.pipe(
startsWith({}),
mergeMap(() => this.service.retrieveusers())
)
https://www.learnrxjs.io/learn-rxjs/operators/combination/concat
/** onInit **/
this.users$ = concat(of({}), this.accountService.changed).pipe(
mergeMap(() => this.service.retrieveusers())
)
答案 1 :(得分:0)
不起作用,因为您正在执行this.users $ observable而不是为相同的observable发出新值。
使用BehaviourSubject保持DOM更新的方法是:
像这样初始化BehaviourSubject:
File "C:\Users\drauter\Dropbox\OZONE\Extremes\geopotential_date_level_PLOT.py", line 32, in <module>
from mpl_toolkits.basemap import Basemap
File "C:\Users\drauter\Miniconda3\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 155, in <module>
pyproj_datadir = os.environ['PROJ_LIB']
File "C:\Users\drauter\Miniconda3\lib\os.py", line 678, in __getitem__
raise KeyError(key) from None
KeyError: 'PROJ_LIB'
所以。要保持视图更新,您需要在模板中执行以下操作:
private MyBehaviourSubject = new BehaviourSubject(/*initial value here*/)
private MyBehaviourObservable = this.MyBehaviourSubject.asObservable()
要发出新值,您需要执行以下操作:
// with this your view always been refreshed after a new emission
{{MyBehaviourObservable | async }}