Angular 2 Router.navigate in Service.好的做法?

Par*_*shi 7 angular2-routing angular

我正在构建一个有许多用户角色的应用程序.因此,当我登录时,我将用户角色返回到响应中并且必须相应地进行导航.我已经创建了一个服务url-redirect.service.ts,并且我已经创建了这样的函数.

redirect(user_role){ 

switch (user_role){
case 1: this.router.navigate[route1];
         break;
case 2: this.router.navigate[route2];
         break;

}
Run Code Online (Sandbox Code Playgroud)

像那样.

但是在我将该事务委托给服务之后,事情就出现在login.component.ts中了.我有一些代码执行如下:

this.urlService.redirect(res.data[0].user_roles);

setCookies();

setLanguage();

and so on;
Run Code Online (Sandbox Code Playgroud)

所以现在工作正常.但我只是觉得这样做是不对的,因为之后会有一些代码,并且路由会在这之间发生变化.我不确定有什么优点和缺点.有人可以告诉我,如果那是好的做法吗?

dan*_*y74 0

我思考过同样的问题。这是我的服务登录方法:

login(credentials: any): Observable<any> {
  return this.http.post(this.endpoint + '/login', credentials)
    .map(this.extractData)
    .do((user) => {
      this.user = user;
      console.warn('on successful login => navigate to redirectUrl');
      this.router.navigate([this.getRedirectUrl()]);
    })
    .catch((err) => {
      this.user = null;
      return this.handleError(err);
    });
}
Run Code Online (Sandbox Code Playgroud)

你可以看到我调用了 .do()

这允许您执行某些操作(在成功响应时),但确保您的方法返回一个 Observable(您可以在调用代码中订阅它)。

我在 .do() 内部进行了导航,因为成功登录将始终导航到当前设置的重定向 URL。

如果它不总是这样做那router.navigate就是错误的。然而,鉴于它总是这样做,那么这种方法可以确保一致性。