Angular 2 @ngrx/redux хранит все строки (действия) для создания журнала
Я думал о том, как мне вести журнал всех строк действий, которые выполняются всеми моими редукторами. Во-первых, имеет смысл, что эта функция может нарушить состояние избыточного доступа только для чтения, поскольку этот журнал будет находиться за пределами приложения и не должен использоваться при переходе назад в состояние. Я подумал, что сервис будет идеальным для этого, потому что они инъекционные и одиночные. Как мне добавить сервис в мои редукторы или как-то сохранить строки действий в массиве?
Вот пример редуктора для моей навигации: Как бы я внедрил сервис в это?
import * as Layout from '../_actions/layout.actions';
export interface State
{
sideNavVisualState: boolean;
sideNavWidthPx: number;
sideNavMarginLeftPx: number;
}
const initialState: State = {
sideNavVisualState: false,
sideNavMarginLeftPx: 0,
sideNavWidthPx: 0
};
export function reducer(state = initialState, action: Layout.Actions): State
{
switch (action.type)
{
case Layout.OPEN_NAV:
return {
sideNavVisualState: true,
sideNavWidthPx: 250,
sideNavMarginLeftPx: 250
} as State;
case Layout.CLOSE_NAV:
return {
sideNavVisualState: false,
sideNavWidthPx: 0,
sideNavMarginLeftPx: 0
} as State;
default:
return state;
}
}
export const getSideNav = (state: State) => state;
2 ответа
Вы не можете ввести что-то в редуктор, но вы можете сделать следующее:
- Создать сервис регистрации
- впрыскивать
Actions
из ngrx (import {Actions} from "@ngrx/effects";
) - Подписываться на
Actions
и войти их (илиtype
) куда угодно
Так что-то вроде этого:
import {Actions} from "@ngrx/effects";
// ...other imports
@Injectable()
export class YourLoggerService {
public logAllActions$ = this.actions$
.map(action => action.type)
.do(actionType => /* ...some logging logic... */);
constructor(private actions$: Actions) {
this.logAllActions$.subscribe();
}
}
ngrx уже дает вам это по замыслу. Вы хотите, чтобы что-то еще произошло, когда ваше действие отправляется помимо просто состояния, меняющего функцию (редуктор)?
Почему бы просто не подписаться на одно и то же действие в эффектах и заняться там регистрацией?
[ОБНОВИТЬ]
И, конечно, делать инъекцию наоборот: вместо того, чтобы вводить действия в сервисы (что бы вы попытались сделать таким образом, реализовать новые эффекты?) - почему бы не внедрить сервис регистрации в эффекты?
[ОБНОВИТЬ]
Магазин ngrx работает так:
У вас есть редукторы, которые являются чистыми функциями, то есть они не создают побочных эффектов. Все, что они делают, это обновляют состояние. (возьмите слово "update" с зерном соли, особенно если вы смешаете ChangeDetectionStrategy.OnPush и Immutables в историю). Редукторы подписаны только на действия, которые должны изменить состояние. Например, Load_Something_From_Server_FINISHED (имеется в виду, что вы получили ответ от сервера). В рамках этих действий вы будете иметь / должны иметь данные с сервера, и именно этим ваш редуктор будет обновлять состояние.
У вас есть побочный эффект, который также прослушивает действия, но только те, которые инициируют что-то с побочными эффектами, например, запросы ajax. Итак, эффекты слушают такие действия, как Load_Something_From_Server_STARTREQUEST (и здесь из-за эффектов вы вызываете сервис, который отправляет фактический http-запрос). Когда ответ возвращается, вы отправляете действие Load_Something_From_Server_FINISHED (которое прослушивает редуктор) с данными с сервера (данные, отправленные в полезной нагрузке действия).
Когда вы думаете о ведении журнала, его побочный эффект по умолчанию. Таким образом, всякий раз, когда какое-либо действие отправлялось и редуктор реагировал на него (обновленное состояние), вы также хотите сохранить его где-нибудь. Ничто не мешает вам иметь и эффекты, и редуктор для прослушивания одного и того же действия, если вы используете их для того, для чего они предназначены: редуктор для обновления состояния, эффекты для побочных эффектов.
Это означает, что когда ваше действие отправляется, ваш редуктор должен слушать его, чтобы обновить состояние и ваши эффекты, чтобы сохранить в журнале.