我正在使用 Angular 2 和@ngrx/store.question 开发一个关于良好实践以及如何做到这一点的项目。
我开发了一个“网络查找器”来管理文件。所以我可以做一些基本的动作,比如复制、移动等。
我不会解释原因,因为这只是一个示例,但移动文件包含 3 个步骤:
- 逻辑:做一些验证。
- 发送一个动作 A
- 发送一个动作 B
这 3 个步骤是在我的角度组件内完成的。我已经考虑过了,我认为简单地调度一个执行一些验证的动作并调度其他 2 个动作是一个更好的主意。
我为什么要这样做?首先,它更容易阅读
this._store.dispatch(copy(myFile));
而不是
// ...
// verifications
// ...
this._store.dispatch(action1(myFile, foo, bar));
this._store.dispatch(action2(myFile));
其次,我可以copy
即时调度我的动作创建者而不会遇到任何副作用,因为验证将在动作内部执行。
实际上,我可以在不进行验证的情况下发送我的action1
et 。action2
最后,我所有的逻辑都在我的行动中。我可以让我的组件保持简单并专注于他们的工作(管理 UI 等)。这是伟大的。
问题1:好的做法?
这样做是个好主意吗?我想是的,但你的经历让我很感兴趣。
问题2:如何?
怎么做 ?我的动作创建者只是函数。我不能用 来装饰它们Injectable
并使用constructor
来注入实例。
以下是动作创建者的示例:
import { Action } from '@ngrx/store'
export const NAVIGATE_TO_NODE:string = '[Browser] Navigate to node';
export const ADD_TO_SELECTION:string = '[Browser] Add to browser selection';
export const REMOVE_FROM_SELECTION:string = '[Browser] Remove from browser selection';
export const REMOVE_ALL_FROM_SELECTION:string = '[Browser] Remove all from browser selection';
export const navigateToNode:(nodeId: number, paneId?: number)=>Action = (nodeId: number, paneId?: number) => {
return {
payload: { nodeId, paneId },
type: NAVIGATE_TO_NODE
};
};
export const addToSelection: (addInfo: any)=>Action = (addInfo: any) => {
return {
payload: addInfo,
type: ADD_TO_SELECTION
};
};
export const removeFromSelection: (removeInfo: any[])=>Action = (removeInfo: any[]) => {
return {
payload: removeInfo,
type: REMOVE_FROM_SELECTION
}
};
export const removeAllFromSelection: ()=>Action = () => {
return {
payload: null,
type: REMOVE_ALL_FROM_SELECTION
}
};
我怎样才能从那些动作创建者那里分派?
我已经使用 redux 作为 Redux 与 React 的实现,并且我创建了一个小包,允许我从动作创建者调度:redux-thunk