我正在使用angular 2和@ngrx/store进行一个项目。关于一个好的实践和如何做到这一点的问题。
我开发了一个“网络查找器”来管理文件。所以我可以做一些基本的动作,比如复制,移动等等。
我不解释原因,因为这只是一个例子,但移动文件包括三个步骤:
逻辑:做一些验证。
派遣行动
派遣行动B
这三个步骤是在我的角度组件内完成的。我已经考虑过了,我认为最好是简单地分派一个动作进行一些验证,然后再分派另外两个动作。
我为什么要这样做?首先,它更容易阅读
this._store.dispatch(copy(myFile));
而不是
// ...
// verifications
// ...
this._store.dispatch(action1(myFile, foo, bar));
this._store.dispatch(action2(myFile));
其次,我可以在不经历任何副作用的情况下动态发送我的
copy
动作创建者,因为验证将在动作内部执行。实际上,我可以在不进行验证的情况下发送我的
action1
etaction2
。最后,我所有的逻辑都在我的行动中。我可以让我的组件保持简单并专注于他们的工作(管理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的一个实现,并且我已经找到了一个小的包,它允许我从一个action creator进行分派:redux-thunk
最佳答案
我将支持WiredProgrammer的建议,看看NGRX示例应用程序。它展示了如何构造动作、还原和效果。
这是可注射动作类的一个例子。
@Injectable()
export class BookActions {
static SEARCH = '[Book] Search';
search(query: string): Action {
return {
type: BookActions.SEARCH,
payload: query
};
}
然后在你的组件中…
constructor(private store: Store<AppState>, private bookActions: BookActions) {}
search(query: SearchOutput) {
this.store.dispatch(this.bookActions.search(query));
}
这边走。还原剂应该是纯功能,没有副作用。因此,例如,要移动一个文件,您可以发送一个启动事务的操作,该操作可以用文件名、目的地和所需的任何其他操作详细信息设置状态。函数将返回新状态。叫这个减速器开始移动。
在效果中,注意开始移动,获取包含事务详细信息的状态,然后执行事务的第一部分。完成后,使用更新的状态发送一个动作以移动u2,或者其他更具描述性的动作。
这个减速机使用下一步所需的详细信息设置状态,并返回它。
效果监视移动2,然后执行事务的第二阶段。完成后,发送移动3。作为一个函数,它只需为第三部分设置状态,效果就可以获取细节并完成事务。完成后,dispatch move_success将使用新文件名或其他设置状态。
进程中的任何一点如果有错误,移动错误都可以被分派,并以类似的方式进行清理或返回到初始状态。或者如果需要,移动取消。
组件可以观察状态并向用户更新状态。