NGRX: Правильный ли способ создать «глобальное» действие, на которое реагирует несколько редукторов? - PullRequest
2 голосов
/ 18 марта 2019

Что такое правильный способ объявления "INIT_ACTION", что все редукторы в ActionReducerMap может реагировать на?

это пример того, как мой код, мне нужно, чтобы все 3 редуктора (изображения, теги, добавленные теги) реагировали на одно действие :

import { ActionReducerMap, createFeatureSelector } from '@ngrx/store';

import * as fromRoot from '../../../store';

import * as fromImages from './image.reducer';
import * as fromTags from './tag.reducer';
import * as fromAddedTags from './added-tag.reducer';

export interface AnalysisState {
	images: fromImages.State;
	tags: fromTags.State;
	addedTags: fromTags.State;
}
export interface State extends fromRoot.State {
	analysis: AnalysisState;
}

export const reducers: ActionReducerMap<AnalysisState> = {
	images: fromImages.reducer,
	tags: fromTags.reducer,
	addedTags: fromAddedTags.reducer
};

export const getAnlysisState = createFeatureSelector<AnalysisState>('analysis');

это пример файла действий:

import { Action } from '@ngrx/store';
import { Tag } from '../../models/tag.model';

export const enum AddedTagActionTypes {
	ADD_TAG = '[ANALYSIS] - Add Tag'
}

export class AddTag implements Action {
	readonly type = AddedTagActionTypes.ADD_TAG;
	constructor(public payload: Tag) {}
}

export type AddedTagActions = AddTag;

и это пример редуктора:

import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity';

import * as fromAddedTag from '../actions/added-tag.actions';
import { Tag } from '../../models/tag.model';

export interface State extends EntityState<Tag> {}
export const adapter: EntityAdapter<Tag> = createEntityAdapter<Tag>({
	selectId: tag => tag.id
});

export const initialState: State = adapter.getInitialState({});
export function reducer(state = initialState, action: fromAddedTag.AddedTagActions): State {
	switch (action.type) {
		case fromAddedTag.AddedTagActionTypes.ADD_TAG: {
			return adapter.addOne(action.payload, state);
		}

		default: {
			return state;
		}
	}
}
const { selectIds, selectEntities, selectAll, selectTotal } = adapter.getSelectors();


export const getAllAddedTags = selectAll;

1 Ответ

4 голосов
/ 18 марта 2019

Действие проходит через все редукторы. Поэтому, если вы просто поместите оператор case для этого действия во все 3 редуктора, он попадет во все 3 оператора case.

Если в редукторе нет оператора case для конкретного действия, будет запущен оператор case по умолчанию, который просто возвращает исходное состояние, оставляя его неизменным.

Это предполагает, что вы не ленивые загрузчики. Разумеется, редуктор будет срабатывать только в том случае, если он загружен.

...