我想访问状态数据以将结果作为新动作的属性传递。触发效果后,我设法从状态中提取了所需的数据,但是使用数据分派新操作的最后一部分不起作用。我无法在代码的最后一行中将两个参数activeUser
和activeTask
传递给of(GetInstances({activeUser, activeTask}))
部分。
@Effect()
updateInstanceLabelSuccess$ = this._actions$.pipe(
ofType<Action>(EInstanceActions.UpdateInstanceLabelSuccess),
concatMap(action => of(action).pipe(
withLatestFrom(combineLatest(
[this._userStore.pipe(select(selectActiveUser)),
this._userStore.pipe(select(selectActiveTask))]
))
)),
tap(([action, [activeUser, activeTask]]: [Action, [User, Task]]) => {
console.log(activeUser, activeTask);
// activeUer and activeTask successfully loaded
// pass activeUser + activeTask to props of Action GetInstances
}),
// activeUser and activeTask can´t be passed to new GetInstances Action
switchMap(([action, [activeUser, activeTask]]: [Action, [User, Task]]) => of(GetInstances({activeUser, activeTask})))
);
如何将两个参数activeUser
和activeTask
传递给新的GetInstances
动作?
编辑:
我通过以下代码使用它。这是解决这个问题的有效方法吗?
@Effect()
updateInstanceLabelSuccess$ = this._actions$.pipe(
ofType<Action>(EInstanceActions.UpdateInstanceLabelSuccess),
concatMap(action => of(action).pipe(
withLatestFrom(combineLatest(
[this._userStore.pipe(select(selectActiveUser)),
this._userStore.pipe(select(selectActiveTask))]
))
)),
map(([action, [activeUser, activeTask]]: [Action, [User, Task]]) => GetInstances({userID: activeUser.id, taskID: activeTask.id}))
);
答案 0 :(得分:1)
该代码看起来不错,并且是一种完全有效的方法。
除非我丢失了某些东西,否则我认为您可以清理以下内容:
@Effect()
updateInstanceLabelSuccess$ = this._actions$.pipe(
ofType<Action>(EInstanceActions.UpdateInstanceLabelSuccess),
withLatestFrom(
this._userStore.pipe(select(selectActiveUser)),
this._userStore.pipe(select(selectActiveTask)),
(action, activeUser, activeTask) => [activeUser, activeTask]
),
map(([activeUser, activeTask]): [User, Task]) => GetInstances({userID: activeUser.id, taskID: activeTask.id}))
);
我在这里所做的所有事情都是利用withLatestFrom的重载,包括最终的投影功能,在您不想携带无关的Action的这些情况下,我发现它们很有用。
另一个建议是创建一个新的选择器,将您拥有的那两个结合起来。我知道这听起来有些矫kill过正,但由于内置了选择器结果的缓存,因此这样做会给您带来很小的性能优势。
无论如何,我希望能有所帮助。搞清楚这一点很不错。