我一直在考虑如何维护所有减速器执行的所有动作字符串的日志。首先,有意义的是这个函数可以打破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;
答案 0 :(得分:0)
你不能在reducer中注入一些东西,但你可以做的是:
Actions
)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();
}
}
答案 1 :(得分:0)
ngrx已经按照设计给你了。当您的动作仅在纯函数更改状态(reducer)旁边发送时,您还希望发生其他事情吗?
为什么不在效果中订阅相同的动作并在那里进行记录?
<强> [UPDATE] 强>
然而,当然,注射反之亦然:而不是向服务注入动作(你会尝试这样做,新效果实现?) - 为什么不将日志服务注入效果?
<强> [UPDATE] 强>
ngrx商店的工作原理如下:
你有减压器,它们是纯粹的功能,这意味着它们没有副作用。他们所做的只是更新状态。 (特别是如果你把ChangeDetectionStrategy.OnPush和Immutables混合成故事的话,可以用词来更新&#39; Reducers仅订阅应该更改状态的操作。例如,Load_Something_From_Server_FINISHED(意思是,您已从服务器获得响应)。在该动作有效负载内,您将/应该拥有来自服务器的数据,这是您的reducer将使用的状态更新。
您有副作用,它也会侦听操作,但只会启动带有副作用的内容,例如ajax请求。因此,效果会侦听Load_Something_From_Server_STARTREQUEST之类的操作(此处,从效果中,您调用发送实际http请求的服务)。当响应返回时,您使用来自服务器的数据(在操作有效负载中发送的数据)调度Load_Something_From_Server_FINISHED操作(reducer侦听)。
当您考虑记录时,默认情况下会产生副作用。因此,每当调度某个动作并且减速器对它做出反应(更新状态)时,您也希望将其保存在某处。只要你将它们用于它们的用途,没有什么能阻止你同时使用效果和减速器来监听相同的动作:用于更新状态的减速器,用于副作用的效果。
这意味着,当您调度操作时,您的reducer应该监听它以更新状态和效果以保存到日志。