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 ответа

Вы не можете ввести что-то в редуктор, но вы можете сделать следующее:

  1. Создать сервис регистрации
  2. впрыскивать Actions из ngrx (import {Actions} from "@ngrx/effects";)
  3. Подписываться на 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 работает так:

  1. У вас есть редукторы, которые являются чистыми функциями, то есть они не создают побочных эффектов. Все, что они делают, это обновляют состояние. (возьмите слово "update" с зерном соли, особенно если вы смешаете ChangeDetectionStrategy.OnPush и Immutables в историю). Редукторы подписаны только на действия, которые должны изменить состояние. Например, Load_Something_From_Server_FINISHED (имеется в виду, что вы получили ответ от сервера). В рамках этих действий вы будете иметь / должны иметь данные с сервера, и именно этим ваш редуктор будет обновлять состояние.

  2. У вас есть побочный эффект, который также прослушивает действия, но только те, которые инициируют что-то с побочными эффектами, например, запросы ajax. Итак, эффекты слушают такие действия, как Load_Something_From_Server_STARTREQUEST (и здесь из-за эффектов вы вызываете сервис, который отправляет фактический http-запрос). Когда ответ возвращается, вы отправляете действие Load_Something_From_Server_FINISHED (которое прослушивает редуктор) с данными с сервера (данные, отправленные в полезной нагрузке действия).

  3. Когда вы думаете о ведении журнала, его побочный эффект по умолчанию. Таким образом, всякий раз, когда какое-либо действие отправлялось и редуктор реагировал на него (обновленное состояние), вы также хотите сохранить его где-нибудь. Ничто не мешает вам иметь и эффекты, и редуктор для прослушивания одного и того же действия, если вы используете их для того, для чего они предназначены: редуктор для обновления состояния, эффекты для побочных эффектов.

Это означает, что когда ваше действие отправляется, ваш редуктор должен слушать его, чтобы обновить состояние и ваши эффекты, чтобы сохранить в журнале.

Другие вопросы по тегам