#javascript #angular #typescript #ngrx #ngrx-entity
#javascript #angular #typescript #ngrx #ngrx-объект
Вопрос:
я хочу установить токен и обновить токен в 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.
как я могу решить эту проблему?
Ответ №1:
Вы используете ngrx/entity
для данных, не являющихся объектами. Объект предназначен для работы с массивами данных, где каждый элемент имеет какой-то уникальный идентификатор. Вот почему он выдает ошибку: вы передаете ему данные, не совместимые с объектом. Вам нужно написать простой редуктор, который просто устанавливает состояние, а не тот, который пытается добавить данные в несуществующий объект.
Что касается перезагрузки страницы, NgRx всегда сбрасывает данные, это ожидаемое поведение. Вам необходимо реализовать localStorage
сохранение, если вы хотите сохранять данные с течением времени.