是否可以既分派一系列动作又从 ngrx 效果导航?
Is it possible to both dispatch an array of actions and also navigate from an ngrx effect?
我的一个应用程序的 ngrx 效果有问题。我基本上是在尝试使用 concatMap()
AND 执行多个操作,并使用路由器商店的 go()
.
进行导航
效果如下:
@Effect()
loadPersonalInfoAndSignin$: Observable<Action> = this.actions$
.ofType(session.ActionTypes.LOAD_PERSONAL_INFO)
.map((action: LoadPersonalInfoAction) => action.payload)
.do(sessionToken => {
localStorage.setItem('authenticated', 'true');
localStorage.setItem('sessionToken', sessionToken);
})
.switchMap(() => this.userAccountService
.retrieveCurrentUserAccount()
.concatMap(currentUserAccount => [
new LoadUserAccountAction(currentUserAccount),
new SigninAction(),
new LoadMessagesAction({})
])
)
.mapTo(go(['/dashboard']));
如果我删除 .mapTo(go(['/dashboard']))
,那么 concatMap
数组中的所有三个动作都会成功分派给它们相应的效果。
因此我想知道为什么我的 mapTo(go(...
导致数组中的最后两个操作(即 SigninAction
和 LoadMessagesAction
)没有被分派到它们相应的效果..
有人可以帮忙吗?
编辑:将mapTo
改为do
如下:
.do(go(['/dashboard']));
导致以下错误:
ERROR in /Users/julien/Documents/projects/bignibou/bignibou-client/src/app/core/store/session/session.effects.ts (55,9): Argument of type 'Action' is not assignable to parameter of type 'PartialObserver<SigninAction>'.
Type 'Action' is not assignable to type 'CompletionObserver<SigninAction>'.
Property 'complete' is missing in type 'Action'.
使用 do
进行 go
调用将不会看到路由更改。 go
is an action creator 并且它创建的操作需要从效果中发出,以便 @ngrx/router-store
接收操作并影响路由更改。
此外,mapTo
运算符将忽略它接收到的内容并发出您指定的值,因此也不合适。
相反,您应该在 concatMap
数组中包含 go
调用创建的操作:
@Effect()
loadPersonalInfoAndSignin$: Observable<Action> = this.actions$
.ofType(session.ActionTypes.LOAD_PERSONAL_INFO)
.map((action: LoadPersonalInfoAction) => action.payload)
.do(sessionToken => {
localStorage.setItem('authenticated', 'true');
localStorage.setItem('sessionToken', sessionToken);
})
.switchMap(() => this.userAccountService
.retrieveCurrentUserAccount()
.concatMap(currentUserAccount => [
new LoadUserAccountAction(currentUserAccount),
new SigninAction(),
new LoadMessagesAction({}),
go(['/dashboard'])
])
);
我的一个应用程序的 ngrx 效果有问题。我基本上是在尝试使用 concatMap()
AND 执行多个操作,并使用路由器商店的 go()
.
效果如下:
@Effect()
loadPersonalInfoAndSignin$: Observable<Action> = this.actions$
.ofType(session.ActionTypes.LOAD_PERSONAL_INFO)
.map((action: LoadPersonalInfoAction) => action.payload)
.do(sessionToken => {
localStorage.setItem('authenticated', 'true');
localStorage.setItem('sessionToken', sessionToken);
})
.switchMap(() => this.userAccountService
.retrieveCurrentUserAccount()
.concatMap(currentUserAccount => [
new LoadUserAccountAction(currentUserAccount),
new SigninAction(),
new LoadMessagesAction({})
])
)
.mapTo(go(['/dashboard']));
如果我删除 .mapTo(go(['/dashboard']))
,那么 concatMap
数组中的所有三个动作都会成功分派给它们相应的效果。
因此我想知道为什么我的 mapTo(go(...
导致数组中的最后两个操作(即 SigninAction
和 LoadMessagesAction
)没有被分派到它们相应的效果..
有人可以帮忙吗?
编辑:将mapTo
改为do
如下:
.do(go(['/dashboard']));
导致以下错误:
ERROR in /Users/julien/Documents/projects/bignibou/bignibou-client/src/app/core/store/session/session.effects.ts (55,9): Argument of type 'Action' is not assignable to parameter of type 'PartialObserver<SigninAction>'.
Type 'Action' is not assignable to type 'CompletionObserver<SigninAction>'.
Property 'complete' is missing in type 'Action'.
使用 do
进行 go
调用将不会看到路由更改。 go
is an action creator 并且它创建的操作需要从效果中发出,以便 @ngrx/router-store
接收操作并影响路由更改。
此外,mapTo
运算符将忽略它接收到的内容并发出您指定的值,因此也不合适。
相反,您应该在 concatMap
数组中包含 go
调用创建的操作:
@Effect()
loadPersonalInfoAndSignin$: Observable<Action> = this.actions$
.ofType(session.ActionTypes.LOAD_PERSONAL_INFO)
.map((action: LoadPersonalInfoAction) => action.payload)
.do(sessionToken => {
localStorage.setItem('authenticated', 'true');
localStorage.setItem('sessionToken', sessionToken);
})
.switchMap(() => this.userAccountService
.retrieveCurrentUserAccount()
.concatMap(currentUserAccount => [
new LoadUserAccountAction(currentUserAccount),
new SigninAction(),
new LoadMessagesAction({}),
go(['/dashboard'])
])
);