【发布时间】:2017-12-16 20:10:05
【问题描述】:
从服务器接收到一组新数据后,我对更新和从减速器返回正确状态感到困惑。我实际上不明白服务器响应后要返回什么(如何更新状态)。 为了更清楚我的困惑:
举个例子:在待办事项应用程序上,我会有一个 reducer:
// imports..
export function todoReducer(state = [], action) {
switch (action.type) {
// some cases...
case todoActions.TODO_LOADED: {
return [
...state,
{
...action.payload
}
]
}
// some more cases...
default:
return state;
}
}
以及效果:
@Effect() todoList$: Observable<any> = this.action$
.ofType(todoActions.TODO_LOAD)
.switchMap(() => {
return this.http
.get('/rest/todo-list')
.map((todos: Todos) => new todoActions.TodoLoaded(todos))
.catch(err => Observable.of(new todoActions.TodoFailed(err)));
});
当 todoActions.TODO_LOAD 被触发时,我显然会得到 todo 列表。到这里就清楚了。
但是,如果用户从 UI 中删除待办事项,我如何更新减速器中的状态?我会从我的组件中调度一个 todoActions.TodoRemove 操作,其中包含要删除的待办事项的 id 和...
对于经验:
@Effect() removeTodo$: Observable<any> = this.action$
.ofType(todoActions.TODO_REMOVE)
.switchMap((action : todoActions.TodoRemove) => {
return this.http
.delete(`/rest/todo-list/${action.payload['todoId']}`)
.map(() => {
// What kind of action should I apply here?
})
.catch(err => Observable.of(new todoActions.TodoFailed(err)));
});
所以问题是在服务器成功响应后我应该触发什么样的操作(假设我只得到 200 个)?
如果我再次触发 todoActions.TODO_LOAD。它将列表与之前的状态合并,我会得到双倍的 todos...
但是我们不应该改变状态...所以我不应该在每次加载新的 todos 时刷新状态...对吗?
或者我只需要创建一个像 todoActions.TODO_REMOVE_SUCCESSED 这样的新操作,然后从服务器返回新的待办事项列表而不带状态...比如:
case todoActions.TODO_REMOVE_SUCCESSED: {
return [...action.payload ]
}
这会是反模式吗?
也许这是一个愚蠢的问题,但我不明白这里的想法......
提前致谢!
【问题讨论】:
-
我会说你在正确的轨道上执行成功(和失败)删除的操作:)
标签: javascript angular typescript ngrx