我正在尝试使用ngrx与实体实现身份验证。到目前为止,我的解决方案是将商店中的用户进行划分'users'和'user',后者用于跟踪经过身份验证的用户。
我希望能够在UI中显示登录的用户数据,这要求我从'user'存储切片中选择唯一的实体。但是,我没有一个简洁的方法来获取登录用户的id(因为使用实体适配器,从reducer返回的东西必须存储为键值对)
问题:有没有一种方法来获得一个单例对象的实体,没有相关的id?这种实现是否违背了实体的目的?我没有绑定到它,只是想留在实体中,因为应用程序的其他部分使用它。
我现在没有抛出错误,但它也不工作:
//in app.component
user$ : Observable<User>;
constructor(private store : Store<AppState>) {}
ngOnInit() {
// selectAll is the default selector from entity adapter
this.user$ = this.store.select(fromUser.selectAll)[0];
// selectAll returns an array, so
this.store.dispatch( userActions.getUser());
}
我还写了一个自定义选择器,它基本上做同样的事情:
export const selectAuthenticatedUser = () =>
createSelector(
fromUser.selectAll,
(entities : User []) => {
return entities[0]
}
)
和我已经尝试使用rxjs。方法,但这会导致错误
export const selectAuthenticatedUser = () =>
createSelector(
fromUser.selectAll,
(entities : User []) => {
return entities.take(1)
}
)
也许我读错了这个问题,但如果你只是在状态中存储单个实体,我建议不要使用@ngrx/entity,只使用单个"用户";财产。
如果你决定使用@ngrx/entity,你只是想检索存储的项目,你的代码片段似乎很好,但你可以只是将选择器分配给一个变量(而不是创建一个工厂方法)
export const selectAuthenticatedUser = createSelector(
fromUser.selectAll,
(entities : User []) => {
return entities[0]
}
)