【问题标题】:updating ngrx state using object.assign{}, after state gets updated the page is getting redirect automatically使用 object.assign{} 更新 ngrx 状态,状态更新后页面会自动重定向
【发布时间】:2018-03-16 08:39:03
【问题描述】:

我在成功登录后将用户添加到 ngrx 状态。登录后,将同一用户添加到状态。从个人资料页面部分更新用户详细信息并使用Object.assign{} 替换状态后,用新数据替换旧状态,但在此操作之后页面会自动重定向。

我尝试了各种可能性来纠正代码。页面自动将我重定向到我的主页。我没有在任何地方使用过任何router.navigate('')

我正在使用:ngrx/store=> v.4.0.4

下面是reducer、action和effect的代码:

effects.ts

@Effect()
    userUpdate$ = this.actions$
        .ofType(AuthActions.USER_UPDATE)
        .map((action: AuthActions.userUpdate) => action.payload)
        .mergeMap(response => 
          this.authService.retrieveLoggedUser(response.uid, response.token) //will get the user details
            .map(res => {
                var resObj = { user: res };
                return resObj;
            }).switchMap(user =>new UserActions.loadUserUpdate(resObj.user) //returns new action to update the user in state
            )
            .catch((error: any) => {
                return of(new UserActions.loadUserFailure(error));
            })
        );

我可以使用Object.assing{} 更新状态,获得正确的状态值,但页面被重定向。

是的,我确实有身份验证防护,其中个人资料页面只能通过防护访问,因此只有经过身份验证的用户才能访问他们的个人资料页面。

控制台中没有错误。调度事件成功执行并使用新数据更新状态。

我的 routing.ts 如下所示:

const appRoutes: Routes = [
    { path: '', component: HomepageComponent, },
    { path: 'login', component: LoginComponent },
    { path: 'register', component: RegisterComponent },
    { path: 'user/updateprofile', component: EditProfileComponent, canActivate: [AuthGuard] },
    { path: '**', redirectTo: 'pagenotfound' }
];

constructor(private db: Database, private router: Router, private store$: Store, private spinnerService: SpinnerService) { this.spinnerService.show(); }

verifyTheUser(): Observable<boolean> {
    return this.db.query('user').map(user => user).take(1);
}

authGuard.ts

 canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
        return this.verifyTheUser().map(res => {
            if (res != undefined && res != null && res['user'] != undefined && res['user'] != null) {
                if (res['user'].uid != 0) {
                    this.isLoggedIn = true;
                } else if (res['user'].uid == 0) {
                    this.isLoggedIn = false;
                }
            }
            console.log(this.isLoggedIn);

            return this.isLoggedIn;
        });

    }

用户更新的效果

  userUpdate$ = this.actions$
            .ofType(AuthActions.USER_UPDATE)
            .map((action: AuthActions.userUpdate) => action.payload)
            .mergeMap(response => this.authService.retrieveLoggedUser(response.uid, response.token)
                .map(res => {
                   var resObj = { user: {user: res, id: response.id } };
                    return resObj;
                }).switchMap(response =>
                    this.db.insert('user', [response.user])
                        .map(() => new UserActions.loadUserUpdate(response.user))
                )
                .catch((error: any) => {
                   return of(new UserActions.loadUserFailure(error));
                })
            );

我在保存时使用观察者来获取更改检测以在屏幕上反映它,是因为观察者代码我被重定向了吗?? this.profileObserver.next(data);

profilecomponent.ts

 UpdateTheProfileInfo(requestData) {
    this.loading = true;
    this.auth.updateInfo(requestData, this.uid).subscribe(() => {
this.UpdateTheUser();
    }, error => {
console.log(error);
    });
  }

  UpdateTheUser() {
    if (this.uid != undefined && this.uid != null && this.keyID != undefined && this.keyID != null) {
      this.store$.dispatch(new AuthActions.userUpdate({ uid: this.uid, token: this.token, id: this.keyID }));
    }

【问题讨论】:

  • 尝试提供更多信息...控制台中是否有任何错误?你的路由是什么样的?你有警卫吗?
  • 请检查我添加的细节......
  • 这很奇怪。检查您触发更新操作的模板...您是否可能在您使用的链接上收听(click)˙&lt;a href="#"&gt;(带有哈希/磅)?这是我目前唯一能想到的会产生这种行为的事情。
  • 所以,我说的是假设您使用&lt;a href="#"...&gt; 之类的东西来触发您的更新操作。如果是这种情况,请从您的链接中删除 href="#"。从技术上讲,您实际上应该使用一个按钮来触发您的更新操作,因为它不是导航而是用户执行的操作。另外,您还可以从您的(click) 处理程序方法中return false;(如果您想继续使用&lt;a href...&gt;

标签: angular ngrx-effects ngrx-store-4.0


【解决方案1】:

所以在 cmets 中,您使用带有按钮类型 submit 的表单来登录。

因此,您必须在表单上使用 (submit) 处理程序绑定,并使用 submit 调用的方法 - 事件处理程序必须通过使用 event.preventDefault() 来防止默认行为。

【讨论】:

  • 我也试过了,但对我没有任何效果....即使我调试了我使用的每一个 routerLink 属性和编程导航。但没有什么会引发我面临的导航问题。
  • 问题仍未解决,我正在为导航重定向而苦苦挣扎
  • 我再次重新检查了所有内容,并完全删除了上面发布的对象更新效果,即“AuthActions.USER_UPDATE”。现在我只是在更新用户记录并发送加载用户的操作。它再次以与重定向页面相同的方式运行。一旦我将整个用户对象推入状态,即状态再次重置并且页面正在重定向。有谁知道如何解决这个问题????
  • 问题已解决。代码执行混乱。感谢大家给予您的时间和回应。再次感谢大家
猜你喜欢
  • 2022-06-18
  • 2018-12-05
  • 1970-01-01
  • 2020-02-25
  • 2023-03-19
  • 2020-08-08
  • 2020-05-12
  • 2020-03-06
  • 1970-01-01
相关资源
最近更新 更多