Я просматривал учебные пособия по NGRX и пытался реализовать UserAdapter
с пользовательским идентификатором из MongoDB _id
. Итак, у меня работает весь пользовательский идентификатор, но я продолжаю получать эту ошибку ERROR TypeError: "ids is undefined"
при выборе всего адаптера. До сих пор я пришел к выводу, что это происходит из селектора selectAll
в адаптере, но я не знаю, что делать, чтобы исправить это ...
Итак, вот мой users.reducer.ts
export interface UserState extends EntityState<UserModel> {
loading?: boolean;
failed?: Error;
}
export const UserAdapter: EntityAdapter<UserModel> = createEntityAdapter<UserModel>({
selectId: (user: UserModel) => user._id,
sortComparer: (a: UserModel, b: UserModel): number => a._id.localeCompare(b._id)
});
const InitialState = UserAdapter.getInitialState({
loading: false,
ids: [] // I tried sticking this here but it doesn't help
});
const Reducer = createReducer(
InitialState,
on(LoadUsers, (state) => ({
...state,
loading: true
})),
on(SuccessUsers, (state, action) => UserAdapter.addMany(action.users, {
...state,
failed: undefined,
loading: false,
})),
on(FailedUsers, (state, action) => ({
...state,
loading: false,
failed: action,
})),
);
export function UsersReducer(state, action: Action) {
return Reducer(state, action);
}
const {
selectAll,
} = UserAdapter.getSelectors();
export const SelectAllUsers = selectAll;
вот users.model.ts
export interface UserModel {
_id: string;
fullname: string;
pin: string;
mobile: string;
qrcode: string;
image: string;
secret: string;
position: {
type: string,
coordinates: number[]
}[];
roles: {name: string, user: string}[];
token: string;
}
и вот мой users.action.ts
import {createAction, props} from '@ngrx/store';
import {UserModel} from '../../../../models/user.model';
export enum UsersActionTypes {
loadusers = '[USERS]: load users',
successusers = '[USERS]: success users',
failedusers = '[USERS]: failed users',
filterusers = '[USERS]: filter users',
searchusers = '[USERS]: search users'
}
export const LoadUsers = createAction(UsersActionTypes.loadusers);
export const SuccessUsers = createAction(UsersActionTypes.successusers,
props<{users: Array<UserModel>}>());
export const FailedUsers = createAction(UsersActionTypes.failedusers,
props<Error>());
export const FilterUsers = createAction(UsersActionTypes.filterusers,
props<{filter: string, search?: string}>());
export const SearchUsers = createAction(UsersActionTypes.searchusers,
props<{search: string, filter?: string}>());
вот и мой компонент users.component.ts
@Component({
selector: 'app-users',
templateUrl: './users.component.html',
styleUrls: ['./users.component.scss']
})
export class UsersComponent implements OnInit {
users: Observable<UserModel[]>;
@ViewChild('controls') controls: ControlsComponent;
constructor(private store: Store) { }
ngOnInit(): void {
if (this.store) {
this.users = this.store.select(SelectAllUsers);
this.users.subscribe((users) => {
console.log(users);
if (!users) {
this.store.dispatch(LoadUsers());
}
});
}
}
}
Пожалуйста помогите, я перепробовал кучу вещей, которые не работают ...