Angular 启动效果和行动的最佳实践

Angular 启动效果和行动的最佳实践,angular,rxjs,ngrx,ngrx-store,ngrx-effects,Angular,Rxjs,Ngrx,Ngrx Store,Ngrx Effects,因此,我花了大量时间使这两种方法发挥作用,特别是与所有ngrx运营商合作。然而,对于我正在处理的用例,我无法决定哪种方法是最好的 因此,我有以下情况: 在页面加载时,我确保用户已登录,并以身份验证功能状态加载所有用户数据。 我还想在设置功能状态下加载页面加载上的所有设置,但是从api加载设置需要具有我从上一步获得的当前用户id。 我的商店建模如下: 因此,我实施的两种方法是: 第一种方法 我在这里加载用户数据,然后 每当我收到它的效果, 我分派加载设置的AllSettingsRequested操

因此,我花了大量时间使这两种方法发挥作用,特别是与所有ngrx运营商合作。然而,对于我正在处理的用例,我无法决定哪种方法是最好的

因此,我有以下情况:

在页面加载时,我确保用户已登录,并以身份验证功能状态加载所有用户数据。 我还想在设置功能状态下加载页面加载上的所有设置,但是从api加载设置需要具有我从上一步获得的当前用户id。 我的商店建模如下:

因此,我实施的两种方法是:

第一种方法 我在这里加载用户数据,然后 每当我收到它的效果, 我分派加载设置的AllSettingsRequested操作。 @效果{分派:错误} loadUser$=this.actions$ 管 ofTypeAuthActionTypes.UserRequested, 使用LatestfromThis.store.pipeselectisUserLoaded, 筛选器[操作,\u isUserLoaded]=>_isUserLoaded, mergeMap[action,_isUserLoaded]=>this.auth.getUserByToken, 点击用户=>{ 如果用户{ this.store.dispatchnew UserLoaded{user:_user}; this.store.dispatchnew AllSettings请求;/*调度加载设置操作*/ }否则{ this.store.dispatchnew注销; } }, catchErrorerr=>{ console.logerr; 归还[]; } ; 然后在设置效果中,我可以简单地添加以下内容:

@注射的 导出类设置效果{ loadSettings=createEffect=>this.actions$.pipe ofTypeSettingsActionTypes.AllSettingsRequested, 使用this.store.pipeselectcurrentUser中的Latest, 合并映射[操作,用户]=> this.settingsService.getSettings user.id , 地图=>{ 返回新的AllSettingsLoaded{settings:s.model}; } } 这种方法工作得很好,但是从UserLoaded效果发送SettingsRequest操作感觉不正确

第二种方法 第二种方法是在页面加载时启动SettingsRequested操作,并使效果等待用户数据加载,然后调用settings api并加载设置

@注射的 导出类设置效果实现OnInitEffects{ loadSettings=createEffect=>this.actions$.pipe ofTypeSettingsActionTypes.AllSettingsRequested, mergeMapaction=>{ 这里是console.logim; 返回组合测试 行动纲领, this.store.pipeselectcurrentUser } , skipWhile[操作,当前用户]=>{ console.log“检查当前用户..”+当前用户; return!currentUser; }, 合并映射[操作,用户]=> this.settingsService.getSettings user.id , 地图s=>{ 返回新的AllSettingsLoaded{settings:s.model}; } ; /*在页面加载时分派操作*/ NGRX效应:作用{ 返回{type:SettingsActionTypes.AllSettingsRequested}; } 正如您所看到的,这里的效果变得更加复杂,但是,我不需要像第一种方法那样从userload效果中分派SettingsRequest操作


我希望我能够清楚地说明问题和这两种方法。我的问题是,就ngrx最佳实践而言,哪种方法更有意义?

我会选择第三种方法


与其分派UserLoaded和方法1中要求的所有设置,我只分派UserLoaded。设置效果可以侦听此操作并获取设置。通过这样做,您也不必从存储中读取用户id,因为它存在于UserLoaded操作中。

我不太担心这一点,而更担心用户名密码和我的私人JWT就在那里等待抓取。你不应该在任何地方存储用户和传递,JWT应该始终驻留在仅http的cookie中。否则,最轻微的XSS将危及你用户的安全。是的,身份验证部分正在进行中