Angular2:在router.navigate之后没有调用ngOnInit()

时间:2017-08-03 13:06:40

标签: angular login angular-routing angular-services

如果我们的前端角度应用程序失去与后端服务器的连接,我试图将用户重定向回登录屏幕,但是有些东西被破坏了。

通过点击退出来从我的NavBarComponent触发正常注销:

ngOnInit() {
    this.me = JSON.parse(localStorage.getItem('currentUser') || 'null');
}

logout() {
   this._authenticationService.logout();
}

这又调用了身份验证服务注销函数():

logout() {
    localStorage.removeItem('currentUser');
    this._userService.announceLoginUpdate(false);
}

我的NavBarComponent正在订阅updateUserStatus $并将重定向到登录:

this.subscription = _userService.updateUserStatus$.subscribe( loggedIn => {

      this.loggedIn = loggedIn;

      if(this.loggedIn) {   
        console.log('NavbarComponent, 1');      
        this.me = JSON.parse(localStorage.getItem('currentUser') || 'null');
      } else {
        console.log('NavbarComponent, 2');
        this.me = null;
        //this._ref.markForCheck();
        //this._ref.detectChanges();
        this.router.navigate(['/login']);
      }

    });

这一切都有效,但我也希望前端能够检测到它是否已经失去与后端的连接(后端崩溃,重启等)。因此,如果前端从后端收到403,它将尝试向/ user / me执行新的后端请求,如果还返回403,它将重定向到登录屏幕。 (这是到目前为止的基本情景)

我创建了一个带有handleError函数的error.service,如果前端在与后端通信时收到错误,将会调用该函数:

handleError(error: any) {
this._authenticationService.isUserLoggedIn().subscribe(response=> { 
        console.log('isUserLoggedIn, User is logged in', response.statusCode);      

    }, error => { 
        console.log('isUserLoggedIn, User is not logged in', error.statusCode);            

        this._authenticationService.logout();

    });

return Observable.throw("500 internal server error");

}

这不能正常工作。它正确捕获错误(从后端获取403),并调用this._authenticationService.logout(),然后删除用户并强制NavBarComponent订阅的更新,然后重定向到登录页面。

然而,登录页面呈现的登录组件没有文本,没有模型绑定,并且没有调用登录组件ngOnInit。 LoginComponent似乎没有"实例化"。

我的LoginComponent ngOnInit:

ngOnInit() {
    console.log("LoginComponent ngOnInit");
    this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
}

执行普通用户注销时,将调用ngOnInit并且组件可以正常工作。

有谁知道出了什么问题?它是从不同的地方(一个来自组件,一个来自服务)执行的相同代码

我在执行普通用户注销时附加了登录页面的屏幕截图,并且来自"强制"服务注销。

How it should NOT look

How it should look

0 个答案:

没有答案