如何为angular2添加401处理程序

时间:2016-09-11 03:59:28

标签: angular dependency-injection angular2-routing

我的服务布局如下

class BaseService {
  protected handleError() {
    // Logics for handling error
  }
}

@Injectable()
class PostService extends BaseService {
  constructor() {
    super();
  }

  getPosts() {
    this.http
      .get(url)
      .subscribe(cb)
      .catch(this.handleError);
  }
}

现在我想让BaseService在接收401时将用户重定向到登录页面,但这会污染每个派生服务,让他们也注入了一个看起来不太合适的路由器,因为派生服务没有&#39 ;需要这个提供者。此版本列出如下:

class BaseService {
  constructor(private router: Router) {
  }

  protected handleError() {
    // Logics for handling error

    if (status_code === 401) {
      this.router.nagivate(['/login']);
    }
  }
}

@Injectable()
class PostService extends BaseService {
  // Polluted here↓
  constructor(private router: Router) {
    super(router);
  }

  getPosts() {
    this.http
      .get(url)
      .subscribe(cb)
      .catch(this.handleError);
  }
}

然后我试图找到一种方法来手动获取注入的路由器提供商:

class BaseService {
  private router: Router;

  costructor() {
    let injector = ReflectiveInjector.fromResolvedProviders([Router]);
    this.router = injector.get(Router);
  }
}

这并不起作用,因为我没有提供路由器所需的所有令牌:

  

未处理承诺拒绝:无法解析'路由器'(?,?,?,?,?,?,?,?)的所有参数。确保所有参数都使用Inject进行修饰或具有有效的类型注释,并且“'路由器'用Injectable装饰。

鉴于背景,我的问题有两方面:

  1. 鉴于上下文,如何在一个地方正确处理401错误?
  2. 我是否可以使用服务而不通过构造函数注入它?
  3. 谢谢!

0 个答案:

没有答案