Angular 2 @ngrx / redux存储所有字符串(操作)以创建日志

时间:2017-07-18 12:46:02

标签: angular typescript redux ngrx

我一直在考虑如何维护所有减速器执行的所有动作字符串的日志。首先,有意义的是这个函数可以打破redux的只读状态,因为这个日志将存在于应用程序之外,并且不应该用于在状态中向后移动。我认为服务是理想的,因为他们可以注射和单身。我如何将服务注入我的Reducer或以某种方式将动作字符串保存到数组?

以下是导航器的示例缩减器:如何将服务注入其中?

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 个答案:

答案 0 :(得分:0)

你不能在reducer中注入一些东西,但你可以做的是:

  1. 创建日志服务
  2. 从ngrx(Actions
  3. 注入import {Actions} from "@ngrx/effects";
  4. 订阅Actions并将其记录(或type)到您想要的任何地方
  5. 这样的事情:

    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();
        }
    }
    

答案 1 :(得分:0)

ngrx已经按照设计给你了。当您的动作仅在纯函数更改状态(reducer)旁边发送时,您还希望发生其他事情吗?

为什么不在效果中订阅相同的动作并在那里进行记录?

<强> [UPDATE]

然而,当然,注射反之亦然:而不是向服务注入动作(你会尝试这样做,新效果实现?) - 为什么不将日志服务注入效果?

<强> [UPDATE]

ngrx商店的工作原理如下:

  1. 你有减压器,它们是纯粹的功能,这意味着它们没有副作用。他们所做的只是更新状态。 (特别是如果你把ChangeDetectionStrategy.OnPush和Immutables混合成故事的话,可以用词来更新&#39; Reducers仅订阅应该更改状态的操作。例如,Load_Something_From_Server_FINISHED(意思是,您已从服务器获得响应)。在该动作有效负载内,您将/应该拥有来自服务器的数据,这是您的reducer将使用的状态更新。

  2. 您有副作用,它也会侦听操作,但只会启动带有副作用的内容,例如ajax请求。因此,效果会侦听Load_Something_From_Server_STARTREQUEST之类的操作(此处,从效果中,您调用发送实际http请求的服务)。当响应返回时,您使用来自服务器的数据(在操作有效负载中发送的数据)调度Load_Something_From_Server_FINISHED操作(reducer侦听)。

  3. 当您考虑记录时,默认情况下会产生副作用。因此,每当调度某个动作并且减速器对它做出反应(更新状态)时,您也希望将其保存在某处。只要你将它们用于它们的用途,没有什么能阻止你同时使用效果和减速器来监听相同的动作:用于更新状态的减速器,用于副作用的效果。

  4. 这意味着,当您调度操作时,您的reducer应该监听它以更新状态和效果以保存到日志。