【问题标题】:Can decorators call services in angular?装饰器可以用角度调用服务吗?
【发布时间】:2021-05-25 01:36:17
【问题描述】:

我已经开始研究打字稿的装饰器了。 Angular 实现了很多装饰器(组件、可注入对象、指令等)。 我有一个经常性的逻辑来验证用户是否已登录,以及他是否有权执行给定的功能。这是一个例子:

@Component()
class MyClass {
    someMethod() {
         if(this.authService.isLogged() && this.authService.isAuth(...)) { 
             // logic
         }
    }
}

这按计划工作,但阅读代码真的很麻烦,对我的同事来说也是不直观的。我打算做一个装饰器,首先验证用户是否已登录,然后如果该用户满足要求,如果他同时传递两者,则该函数将执行,如果不,它将忽略执行并返回一个默认值。这是我尝试并想出的登录验证功能:

export function isLogged() {
    return (target, key, descriptor) {
        const original = descriptor.value;
        descriptor.value = function (...args: any[]) {
            // <- add login verification here
            return original.apply(this, args);
        };
        return descriptor;
    }
}

我面临的问题是如何调用函数的上下文服务来验证他是否已登录而不显式传递“this”关键字?为了更清楚,这是我试图实现的用法

@Component()
class MyClass {
    @isAuth(...) // <- here without passing 'this'
    @isLogged()
    someMethod() {
        // logic
    }
}

我需要强调的是,这个装饰器需要将验证逻辑推迟到授权服务,因为它具有装饰器的用户登录、权限和其他相关信息。 我要问的一个解决方案是将服务注入给定功能的方法。以我的示例装饰器为例,它有一个注释,指出调用授权的缺失部分。我想有一种方法可以在函数中注入和调用服务,但是网上没有找到任何解决方案。

【问题讨论】:

  • 如果身份验证检查是异步的,那么装饰器不是正确的方法。我见过用于此的路由守卫,以及自定义 ngIf 结构指令,但不是装饰器
  • 为什么你认为你需要明确地传递this 关键字?您已经拥有引用 descriptor.value 函数中可用实例的 this 关键字。就用它吧。
  • @Drenai 在这种情况下不是异步的,但我必须将验证传递给授权服务。
  • @Bergi 使用“this”关键字确实具有服务访问权限。现在的问题是如何指定任何用它装饰其任何方法的类也包括所需的服务。
  • @MuriloMaestro 您的意思是通过在方法上使用装饰器来使 Angular 依赖注入工作?我不知道。

标签: angular typescript ecmascript-6 decorator


【解决方案1】:

根据我的问题中的 cmets,注意到 this 关键字确实具有类的完整上下文,包括放置在其构造函数中的服务。所以我可以修改我的装饰器来访问服务:

export function isLogged() {
    return (target, key, descriptor) {
        const original = descriptor.value;
        descriptor.value = function (...args: any[]) {
            if (this.authorizationService.isLogged()) {
                return original.apply(this, args);
            } else {
                return () => {};
            }
        };
        return descriptor;
    }
}

【讨论】:

  • 感谢后续解答,很高兴知道?
猜你喜欢
  • 1970-01-01
  • 2019-03-10
  • 2021-07-15
  • 2020-05-20
  • 2023-03-16
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2019-02-02
相关资源
最近更新 更多