如何解决传递给`selectId`实现的实体返回未定义
我想在ngrx中设置令牌和刷新令牌,并为每个请求保存和使用令牌,并且在重新加载页面时,不要在redux中删除数据。
我为此实现了这种状态:
我调度数据:
this.getUserInformation().toPromise().then(responset => {
if (response.success === true) {
this.store.dispatch(new SetUserInformation({
displayName: responset['result']['displayName'],userInfo: responset.result.claims,RefreshTokenStatus:false,accessToken:response['result']['access_token'],refreshToken:response['result']['refresh_token']
}))
}
});
在我定义商店的模块中:
StoreModule.forFeature('Information',reducer),EffectsModule.forFeature([])
这是我的减速器:
const initialState = adapter.getInitialState({
accessToken: null,refreshToken: null,RefreshTokenStatus: false,userInfo: null,displayName: null
})
export function reducer(state = initialState,action: TokenAction): TokenState {
switch (action.type) {
case TokenActionTypes.UserInformation:
return adapter.addOne(action.payload,state)
default:
return state;
}
}
这是我的模特:
export interface TokenState {
accessToken: string;
refreshToken: string;
RefreshTokenStatus: boolean;
userInfo: string[];
displayName: string;
}
这是我的Selector
:
export interface State extends fromState.State,EntityState<TokenState> {
UserInfo: TokenState;
}
export const adapter: EntityAdapter<TokenState> = createEntityAdapter<TokenState>();
const getTokenFetureState = createFeatureSelector<TokenState>('Information');
export const getAccessToken=createSelector(
getTokenFetureState,state => state.accessToken
)
这是动作:
export class SetUserInformation implements Action {
readonly type = TokenActionTypes.UserInformation;
constructor(public payload: TokenState) {
}
}
export type TokenAction = SetUserInformation
现在我有拖曳问题:
this.store.pipe(select(fromTokenSelect.getAccessToken)).subscribe(data=>{
console.log(data)
})
A:当我想获取要使用的令牌时,它返回null并显示此错误:
@ ngrx / entity:传递给
selectId
实现的实体未定义返回。您可能应该提供自己的selectId
实现。传递的实体:对象selectId
实现:(实例)=> instance.id
B:重新加载页面时,它将从ngrx中删除数据。
我该如何解决这个问题?
解决方法
您将ngrx/entity
用于非实体数据。实体设计用于处理数据数组,其中每个元素都有某种唯一的标识符。这就是它引发错误的原因:您正在向它提供非实体兼容的数据。您需要编写一个简单的reducer来简单地设置状态,而不是试图将数据添加到不存在的实体中。
对于页面重新加载,NgRx将始终重置数据,这是预期的行为。如果要随着时间的推移保留数据,则需要实施localStorage
保存。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。