我有一个应用程序,在加载时具有我称之为非常常见的导航模式。这些是规则:
storage
... storage.completedOnboarding
为false
,请导航至OnboardingPage storage.completedOnboarding
为true
,请导航至HomePage completedOnboarding
设置为true
。基本上用户只应在第一次加载应用时看到OnboardingPage。
当用户离开OnboardingPage时,应设置storage.completedOnboarding = true
。我在我的商店订阅了completedOnboarding
片段,以确定用户在加载应用时是应该导航到HomePage还是OnboardingPage。
我遇到的问题是,当我更新商店以导航到CreateAccountPage或LoginPage时,这也会在执行导航后将storage.completedOnboarding
更新为true
在Onboarding组件中,我有:
// When Home, CreateAccount, or Landing is clicked
completeOnboarding(toScreen) {
this.store.dispatch({type: NAVIGATE_ACCOUNT_PAGE, payload: toScreen});
}
然后在我的效果中,我有:
@Effect()
navigateAccountPage$ = this.actions$
.ofType(NAVIGATE_ACCOUNT_PAGE)
.mergeMap(() =>
Observable.of(
{type: SET_ONBOARDING_STATUS, payload: true}
)
);
基本上我想在导航到新页面的同时更新completedOnboarding
。将登录状态写入存储后,将触发SET_ONBOARDING_STATUS_COMPLETE
操作以更新存储。这发生在 NAVIGATE_ACCOUNT_PAGE
之后。基本上使用上面的Effect
,它将触发这些状态:
SET_ONBOARDING_STATUS
NAVIGATE_ACCOUNT_PAGE
SET_ONBOARDING_STATUS_COMPLETE
为了解决这个问题,我先检查用户当前所在的页面,然后再根据completedOnboarding
切片进行导航:
this.store.select('completedOnboarding').subscribe(completedOnboarding => {
if (this.rootPage === LoadingPage) {
this.rootPage = completedOnboarding ? HomePage : OnboardingPage;
} else if (this.rootPage === OnboardingPage && completedOnboarding) {
this.rootPage = HomePage;
}
});
这有效,但我宁愿不必进行这些额外的条件检查。我希望能够在某些情况下更新completedOnboarding
州,而不会触发Onboarding / Home页面上的检查。
如果没有额外的条件检查,有没有办法做到这一点?
Example Plunker - 您可以通过将completedOnboarding
设置为false
来查看此内容,例如第一次加载页面时。然后单击"转到"底部的按钮将更新目标导航页面,但您将看到上次运行操作仍为Completed Onboarding
。我们做需要完成入门,用户进入主页/登录页面,但它也应该导航到该页面,即在该状态链中执行的最后一个操作。