繁体   English   中英

Angular 4 自定义装饰器 - 注入服务

[英]Angular 4 Custom decorator - injecting services

我想在我的应用程序中创建一个身份验证装饰器。

用法示例应该很简单

@RequireAuthentication()
@HostListener('click', ['$event']) onClick(event: Event) {
  // ...
}

我知道装饰器只能是函数,所以在其他一些文件中我计划有

export function RequireAuthentication() {
    if (!userService.isAuthenticated) {
        navigationService.goToLogin();
        return;
    }
}

我的问题是在这种情况下如何正确初始化 userService 和 navigationService,因为这些服务包含用于查找用户是否通过身份验证并显示登录屏幕的所有逻辑。

我已经尝试过:

  1. 使用带有构造函数的类进行服务初始化,但是嵌套方法不能用作装饰器
  2. 要使用 Injectable 类创建服务,我需要创建此类的实例,同样的问题。
  3. 使用 ModuleWithProviders 方法隐藏身份验证实现并仅公开装饰器,但不确定这是否是正确的方法。

任何提示都会有所帮助。 可能是因为我不是经验丰富的 Angular 开发人员,所以我错过了一些基本的东西,或者有另一种方法可以解决这个问题。

正如这个答案中所解释的,框架惯用的解决方案是公开injector类实例属性,因此可以在装饰器内部访问它。 injector属性的存在也​​可以通过接口来保证。

由于属性装饰器运行一次并且可以访问类原型但不能访问实例,因此有必要修补ngOnOnit方法并使用this.injector.get()检索修补方法中的所有必要服务。

另一种方法是全球注射器暴露一些对象,如解释在这里 这不是惯用的解决方案,而是会导致某些限制和负面后果的黑客攻击。 很难推荐在生产中使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM