Можно ли использовать данные из состояния A внутри селектора в состоянии B?
Я опробовал Ngxs как систему управления состоянием и натолкнулся на конкретный случай использования, который, похоже, не могу понять. В этом случае я использую два нормализованных объекта (я удалил некоторые ненужные поля для удобства чтения).
export interface Section {
id: number;
sequence: number;
name: string;
subName: string;
totalQuestions: number;
completedQuestions: number;
selected: boolean;
questionFlows: QuestionFlow[];
}
export interface QuestionFlow {
id: number;
contractId: number;
parentId: number;
subSectionId: number;
path: string;
question: string;
type: string;
answer: string;
completed: boolean;
sequenceNumber: number;
selected: boolean;
questionFlows: QuestionFlow[];
}
Эти два объекта находятся в отдельных магазинах. Хранилище Разделов и Хранилище Вопросов. Государственные модели выглядят следующим образом:
export class SectionsStateModel {
sections: { [id: number]: Section };
currentSection: Section;
}
export class QuestionFlowsStateModel {
questionFlows: { [id: number]: QuestionFlow };
currentQuestionFlow: QuestionFlow;
}
Теперь я хотел бы создать селектор в QuestionFlowsState, который возвращает каждый QuestionFlow, который принадлежит currentSection. Можно ли получить currentSection внутри селектора, который находится внутри QuestionFlowState, в то время как currentSection находится внутри SectionState? Я попробовал код ниже (с заполненным магазином) без успеха.
import { SectionsStateModel } from './sections.state';
@State<QuestionFlowsStateModel>({
name: 'questionFlows',
defaults: {
questionFlows: {},
currentQuestionFlow: null
}
})
export class QuestionFlowsState {
@Selector()
static getQuestionFlowsArrayFromCurrentSection(
state: QuestionFlowsStateModel,
sectionState: SectionsStateModel
) {
const questionFlowsFromCurrentSection: QuestionFlow[] = [];
sectionState.currentSection.questionFlows.forEach(questionFlow => {
questionFlowsFromCurrentSection.push(state.questionFlows[+questionFlow]);
});
return questionFlowsFromCurrentSection;
}
}
Если в этом вопросе что-то отсутствует / неясно, пожалуйста, дайте мне знать.
РЕДАКТИРОВАТЬ: После некоторой перемотки с @Danny Blue мы пришли к решению добавить родительское состояние, которое принимает состояния, содержащие данные, необходимые для селектора, в качестве дочерних (которые можно установить в декораторе @State). Чтобы получить доступ к данным из этих детских магазинов, вам нужно позвонить в штат... и все готово. Ниже приведен окончательный код, который решает мою проблему.
import { State, Selector } from '@ngxs/store';
import { SectionsState } from './sections.state';
import { QuestionFlowsState } from './question-flows.state';
import { QuestionFlow } from '../../contract-details.model';
import { SectionsStateModel } from './sections.state';
import { QuestionFlowsStateModel } from './question-flows.state';
@State({
name: 'parent',
children: [SectionsState, QuestionFlowsState]
})
export class ParentState {
@Selector()
static getParentFlowsArrayFromCurrentSection(
state
) {
const questionFlowsFromCurrentSection: QuestionFlow[] = [];
state.sections.currentSection.questionFlows.forEach(questionFlow => {
questionFlowsFromCurrentSection.push(
state.questionFlows.questionFlows[+questionFlow]
);
});
return questionFlowsFromCurrentSection;
}
}
1 ответ
Вы можете добавить селектор в родительский класс состояний, который даст ему доступ к обоим дочерним состояниям.