使用ngrx / store在Ionic应用程序

时间:2017-04-10 22:58:51

标签: angular typescript ionic2 ngrx ngrx-effects

我有一个应用程序,在加载时具有我称之为非常常见的导航模式。这些是规则:

  1. 当应用程序打开时,导航到LoadingPage。从storage ...
  2. 加载
  3. 从商店检索信息后......
    1. 如果storage.completedOnboardingfalse,请导航至OnboardingPage
    2. 如果storage.completedOnboardingtrue,请导航至HomePage
  4. 从OnboardingPage,您可以导航到CreateAccountPage,LoginPage或HomePage中的任何一个。导航离开OnboardingPage将completedOnboarding设置为true
  5. 基本上用户只应在第一次加载应用时看到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。我们需要完成入门,用户进入主页/登录页面,但它也应该导航到该页面,即在该状态链中执行的最后一个操作。

0 个答案:

没有答案