根据Angular中的行为更改刷新可观察(RxJS)

时间:2020-08-04 13:44:24

标签: angular

我正在寻找一种方法,一旦用户在站点中更改了变量/属性,便会刷新以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被触发时,我将如何更新用户?

2 个答案:

答案 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())
)

我强烈建议您看看https://www.learnrxjs.io/learn-rxjs/operators

答案 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 }}
相关问题