Декораторы - это функция 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
}
}