Угловой |Внедрить услугу в декоратор - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь внедрить сервис в функцию декоратора, в которой я создаю, чтобы я мог получить содержимое, которое хранится внутри переменных.

В настоящее время у меня есть базовая настройка декоратора.

export function canEdit(editName: string, service: Service) {
      return function (constructor: any) {
          console.log(constructor);
      }
}

Когда я использую это, он запрашивает у меня второй параметр, который, очевидно, должен вводиться зависимостью.

Я также пробовал @Inject(Service), который не разрешен вфункции.

Есть ли способ, которым я могу это сделать?

Или возможно получить переменные родительских классов в декораторе?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Декораторы - это функция 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
    }
}
0 голосов
/ 05 октября 2018

Внедрение Angular Dependancy работает только внутри класса компонента или службы Angular, которая зависит от другой службы.

Потребитель зависимости, являющейся компонентом Angular, объявляет, что ему требуется в конструкторе, и позволяетрамки предоставляют их.

для получения дополнительной информации о внедрении зависимостей, пожалуйста, обратитесь к официальной документации:

Внедрение зависимостей в действии

https://next.angular.io/guide/dependency-injection-in-action

...