我是 ngrx 和 Redux 风格架构的新手,我在理解应该如何链接动作/效果时遇到问题。一个例子是实现基本功能,例如在用户登录后采取行动。我在这里的核心问题是用户登录后要采取的行动将根据应用程序的当前状态而有所不同——用户可能在任何地方在应用程序中出现登录提示/页面时。
我见过的任何示例都会在用户登录后发生硬编码效果。在我的场景中,如上所述,这不太适合我并不总是希望发生相同的操作。
这是包含登录组件的主页的一些示例代码。在这种情况下,我希望用户在登录后被重定向到“/购买”。
@Component(..)
export class HomePageComponent {
constructor(private store: Store<any>) {
}
public onLoginSubmitted(username, password) {
this.store.dispatch(new loginActions.Login({username, password}));
// once this has happened successfully navigate to /buy
}
}
示例效果
@Injectable()
export class LoginEffects {
......
@Effect()
login$ = this.actions$
.ofType(loginActions.ActionTypes.LOGIN)
.switchMap((data) => {
return this.loginService.login(data.payload)
.map(() => new loginActions.LoginSuccess({loggedIn: true, isLoggingIn: false}))
.catch((error) => {
return of(new loginActions.LoginError({loggedIn: false, isLoggingIn: false}));
});
});
......
}
我对如何解决这个问题有几个想法——但没有一个感觉是对的。这些包括
- 使用登录有效负载传递数据以确定下一步要采取的操作
- 编写许多在 LoginSuccess 时采取行动但在更高级别过滤的效果
- 通过监听商店中的事件来编写特定于组件的效果(这可能/不好的做法吗?)
- 从存储中读取有关当前登录状态的数据并在组件中对此进行操作。但是,此逻辑将立即运行,这可能不会产生预期的效果
谁能指出我正确的道路/提供如何解决此问题的示例?