我试图将服务注入到要在其中创建的装饰器函数中,这样我就可以获取存储在变量内部的内容。
我目前有一个基本的装饰器设置。
export function canEdit(editName: string, service: Service) {
return function (constructor: any) {
console.log(constructor);
}
}
我在使用它的地方问我第二个参数,显然需要注入依赖项。
我还尝试了@Inject(Service)
,这在函数中是不允许的。
有没有办法做到这一点?
还是可以在装饰器中获取父类变量?
答案 0 :(得分:2)
装饰器是TypeScript功能,可在Angular的依赖项注入系统之外工作。
我所知道的唯一解决方案是创建一个特殊服务,该服务将向装饰程序公开依赖项。
@Injectable()
export class DecoratorService {
private static service: Service | undefined = undefined;
public constructor(service: Service) {
DecoratorService.service = service;
}
public static getService(): Service {
if(!DecoratorService.service) {
throw new Error('DecoratorService not initialized');
}
return DecoratorService.service;
}
}
您现在可以通过上述类访问注入的服务。
export function canEdit(editName: string) {
return function (constructor: any) {
const service = DecoratorService.getService();
// ^^^ access dependency here
console.log(constructor);
}
}
除非Angular应用程序中的某些内容依赖于DecoratorService
,否则上述内容将不起作用,因为Angular会在需要时创建实例。因此,您可以将其注入模块以强制对其进行初始化。
@NgModule({
provides: [
DecoratorService
]
})
export class MainModule {
public constructor(service: DecoratorService) {
// ^^^ forces an instance to be created
}
}
答案 1 :(得分:2)
我知道我迟到了,但是,还有另一种方法可以访问装饰器中的服务。
在需要必要服务的模块中暴露 Angular 的注入器:
@NgModule({
declarations: [],
imports: [],
providers: [SomeService]
})
export class SharedModule {
static injector: Injector;
constructor(injector: Injector) {
SharedModule.injector = injector;
}
}
通过模块注入器属性从装饰器内部获取服务:
export const MyDecorator = (): any => {
return (target: object, key: string | symbol, descriptor: PropertyDescriptor): PropertyDescriptor => {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]): any {
// access the service
const service = SharedModule.injector.get<SomeService>(SomeService);
// (...)
};
return descriptor;
};
};
答案 2 :(得分:0)
Angular Dependency注入仅在依赖于另一个服务的组件类或angular服务中起作用。
依赖项的使用者(它是有角组件),在其构造函数中声明其要求,然后让框架提供它们。
有关依赖项注入的更多信息,请参阅官方角度文档:
Dependency Injection in action
https://next.angular.io/guide/dependency-injection-in-action