Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 传递给'selectId'实现的实体返回未定义_Javascript_Angular_Typescript_Ngrx_Ngrx Entity - Fatal编程技术网

Javascript 传递给'selectId'实现的实体返回未定义

Javascript 传递给'selectId'实现的实体返回未定义,javascript,angular,typescript,ngrx,ngrx-entity,Javascript,Angular,Typescript,Ngrx,Ngrx Entity,我想在ngrx中设置token和refresh token,并为每个请求保存和使用它,并且在重新加载页面时不删除redux中的数据 我在本州实施以下措施: i调度数据: this.getUserInformation().toPromise().then(responset => { if (response.success === true) { this.store.dispatch(new SetUser

我想在ngrx中设置token和refresh token,并为每个请求保存和使用它,并且在重新加载页面时不删除redux中的数据

我在本州实施以下措施:

i调度数据:

            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']
                }))
            }
        });
在模块i中定义存储:

    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;
}
这是我的
选择器

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
)
现在我有两个问题:

 this.store.pipe(select(fromTokenSelect.getAccessToken)).subscribe(data=>{
     console.log(data)
 })
答:当我想获取令牌以供使用时,它将返回null并显示此错误:

@ngrx/实体:传递给
selectId
实现的实体返回未定义。您可能应该提供自己的
selectId
实现。传递的实体:对象
selectId
implementation:(instance)=>instance.id

B:重新加载页面时,会从ngrx中删除数据

我如何解决这个问题?


您正在对非实体数据使用
ngrx/entity
。实体设计用于处理数据数组,其中每个元素都有某种唯一标识符。这就是它抛出错误的原因:您正在向它提供与实体不兼容的数据。您需要编写一个简单的reducer来简单地设置状态,而不是试图向不存在的实体添加数据

对于页面重新加载,NgRx将始终重置数据,这是预期的行为。如果要随时间持久保存数据,则需要实现
localStorage
保存

 this.store.pipe(select(fromTokenSelect.getAccessToken)).subscribe(data=>{
     console.log(data)
 })