【发布时间】:2019-06-22 18:07:54
【问题描述】:
如果我有两个或多个 NGRX 操作执行相同的操作,但在我的应用程序的不同部分触发,我可以使用一个操作来执行此操作,同时区分我的 NGRX 日志中的操作字符串吗?我问是因为在编写动作并尝试遵循“动作卫生”原则时,动作应该特定于事件并且可以在一年后读取并告诉开发人员确切地在应用程序中的哪个位置触发了动作,我想限制为尽可能多的 NGRX 样板。
例如:我有一个“AddTodo”操作。此操作可以在我的应用程序中的两个位置执行 - 一个在“待办事项列表”页面上,另一个在“待办事项详细信息”页面上。每个动作对于触发它们的页面都是唯一的,但它们做的事情完全相同;他们向我的状态对象添加了一个新的 Todo 项。
const TODO_LIST = '[Todo List]';
const TODO_DETAILS = '[Todo Details]';
export const TODO_LIST_ADD = `${TODO_LIST} Add`;
export const TODO_DETAILS_ADD = `${TODO_DETAILS} Add`;
export class TodoListAdd implements Action {
readonly type = TODO_LIST_ADD;
constructor(public payload: Todo) { }
}
export class TodoDetailsAdd implements Action {
readonly type = TODO_DETAILS_ADD;
constructor(public payload: Todo) { }
}
export function todoReducer(state = initialState, action: Action): TodoState {
switch (action.type) {
case actions.TODO_LIST_ADD:
case actions.TODO_DETAILS_ADD:
return {
...state,
todo: (action as actions.TodoListAdd | actions.TodoDetailsAdd).payload,
}
default:
return state;
}
}
如果想保持动作卫生,这是唯一的方法吗?有两个操作完全相同,唯一的区别是在 NGRX 事件日志中区分它们的字符串类型。我希望有一种方法可以通过耦合动作创建者来减少样板的数量,而不会失去类型的特异性。
谢谢,
【问题讨论】:
-
从这个角度来看,连续使用几个“案例”来创建这个“失败”并没有什么坏处,消除代码重复是一件好事。但在目前的情况下,甚至从意义的角度来看,合并这两个动作会更好吗?例如添加到“ADD_TODO”中,如果它是相同的实体和状态的相同部分,则从哪个位置添加 todo 并不重要。
-
@AmirArbabian 从哪个地方添加待办事项并不重要...是的,是的。正如 OP 所说,将动作与唯一事件联系起来让应用程序在一年后变得可读,并告诉开发人员确切地在应用程序中的哪个位置触发了动作