【发布时间】:2020-04-05 08:10:12
【问题描述】:
我正在学习一些 ngrx 教程,我想我已经开始思考它了。
我不明白的是如何做一些简单的事情,比如从 Store 获取值:
目标:无需subscribe 即可从商店获得价值。
即:store.myStoreProperty 或 store.getValue(<selector>) 或?
据我了解,从商店中获取价值的唯一方法是执行以下操作:
private readonly _store: Store<ApplicationState>;
// ...
this._store.select(state => state.currentUser).subscribe(user => {
if (!user) { return; }
// ...
});
问题:有没有什么方法可以“立即”从商店获得价值而无需订阅?
我可能只是难以将我的大脑包裹在 selectors 周围,但我有点认为这就是他们的目的。文档中的示例:
import { createSelector } from '@ngrx/store';
export interface FeatureState {
counter: number;
}
export interface AppState {
feature: FeatureState;
}
export const selectFeature = (state: AppState) => state.feature;
export const selectFeatureCount = createSelector(
selectFeature,
(state: FeatureState) => state.counter
);
在这个例子中,我想我可以调用selectFeature 或将它传递给this._store.select(selectFeature) 来获取实际值,但它返回一个observable(因此希望你订阅它)。
我的主要用例是我想在我的应用程序的整个生命周期中访问当前用户信息。我有一个effect,它正在从服务器获取该信息,并且一切正常。但是,我对如何简单地从store 访问值而不必到处撒.subscribe 感到有些困惑。
是的,我见过this,但这对我没有帮助。
【问题讨论】:
-
你考虑过使用异步管道吗?
-
如果异步管道不适合您,您可以在服务的构造函数中订阅一次,将发出的值分配给服务中的公共变量并在您的组件中使用该变量。但您可能会以这种方式访问过时的值,通常最好使用响应式方法。
-
我知道
async管道。这是特定于房屋的 HTML 方面的。我想(立即)从商店获取一个值,以便我可以通过角度服务将该值传递给辅助 api 调用。我不想在我的代码库中到处都是.subscribe。 -
问题是,你的用例是什么?为什么需要在不订阅的情况下从 store 中获取值? ngrx 框架的本质是基于可观察存储(状态),我相信如果您的要求不是这样,那么您应该使用其他一些状态机制。
-
在他们的 github repo 上阅读了几个(非常)热情(但也很有趣)的线程后,拒绝了对此类功能的功能请求,这是不可能的。该团队似乎非常坚持不实现这种功能,因为它“不是被动的”。花了几天时间才知道你必须订阅所有内容,但现在我明白为什么会这样了。 (github.com/ngrx/store/issues/296) 和 (github.com/ngrx/platform/issues/227)
标签: angular typescript redux rxjs ngrx