Angular rxjs/ngrx多播打开。选择

Angular rxjs/ngrx多播打开。选择,angular,rxjs,ngrx,multicast,ngrx-store,Angular,Rxjs,Ngrx,Multicast,Ngrx Store,在@组件中,我是否应该始终多播。选择(myCustomSelector) e、 g 否则,每次执行async,它都会创建一个新订阅。或者是因为选择器已被记忆,所以可以吗 我想知道什么是好的做法。不,你不应该在你的中使用share()。select() 但这取决于您使用的存储实现 在ngrx、ngxs、akita中,存储由一个对象支持,因此从select返回的可观察对象不会触发任何副作用 然后通过一个减速机更新存储,然后所有选择都将获得一个新值,但由于它们都是此单个对象(状态)的工作对象,因此不会

@组件中
,我是否应该始终多播
。选择(myCustomSelector)

e、 g

否则,每次执行
async
,它都会创建一个新订阅。或者是因为选择器已被记忆,所以可以吗


我想知道什么是好的做法。

不,你不应该在你的
中使用
share()
。select()

但这取决于您使用的存储实现

在ngrx、ngxs、akita中,存储由一个对象支持,因此从select返回的可观察对象不会触发任何副作用


然后通过一个减速机更新存储,然后所有选择都将获得一个新值,但由于它们都是此单个对象(状态)的工作对象,因此不会出现性能问题。

否您不应该将
共享()
一起使用。select()

但这取决于您使用的存储实现

在ngrx、ngxs、akita中,存储由一个对象支持,因此从select返回的可观察对象不会触发任何副作用


然后通过一个减速机更新存储,然后所有选择都将获得一个新值,但由于它们都是针对这个单一对象(状态)工作的,所以不会有性能问题。

为什么不在模板的顶层执行一个
异步
,然后重用该值

<ng-container *ngIf="myItems$ | async as myItems">
<div *ngFor="let item of myItems">....</div>
<div *ngFor="let item of myItems">....</div>
<div *ngFor="let item of myItems">....</div>
</ng-container>

....
....
....

为什么不在模板的顶层执行一个
异步
,然后重用值

<ng-container *ngIf="myItems$ | async as myItems">
<div *ngFor="let item of myItems">....</div>
<div *ngFor="let item of myItems">....</div>
<div *ngFor="let item of myItems">....</div>
</ng-container>

....
....
....

这取决于您想做什么。但是,如果您使用多个
async
管道,您将进行多个订阅。但是将.share()添加到我的所有观察对象中,对我来说似乎是一种代码味道。也许性能的提升并没有那么大?如果你的选择器只是从商店中选择了一些东西,我认为这根本不是问题。即使您在选择器中进行了一些计算,使用
createSelector
函数也将确保缓存结果。但您应该做的是确保在组件被销毁时取消订阅(可能使用
takeUntil
)。如果您认为添加share()是一种代码味道(但事实并非如此),则可以通过容器(父容器)包装组件,订阅一次并将值传递给所需的组件。这取决于您想要执行的操作。但是,如果您使用多个
async
管道,您将进行多个订阅。但是将.share()添加到我的所有观察对象中,对我来说似乎是一种代码味道。也许性能的提升并没有那么大?如果你的选择器只是从商店中选择了一些东西,我认为这根本不是问题。即使您在选择器中进行了一些计算,使用
createSelector
函数也将确保缓存结果。但您应该做的是确保在组件被销毁时取消订阅(可能使用
takeUntil
)。如果您认为添加share()是一种代码味道(但事实并非如此),您可以通过容器(父容器)包装组件,订阅一次并将值传递给所需的组件。但是如果在我看来我有多个异步管道呢?这肯定会影响性能,因为每个异步都是一个新订阅?对给定的可观察对象使用多个异步管道是一种反模式。在ngOnInit中订阅一次,并将结果保存到lokal变量中,然后确保在Ngondestory中取消订阅,以避免释放订阅。但在我看来,如果有多个异步管道,该怎么办?这肯定会影响性能,因为每个异步都是一个新订阅?对给定的可观察对象使用多个异步管道是一种反模式。在ngOnInit中订阅一次,并将结果保存到lokal变量,然后确保在Ngondestory中取消订阅,以避免对订阅造成影响,这会有帮助。