Угловой сервис не определен в методе компонента с пользовательским TS-декоратором - PullRequest
0 голосов
/ 04 июня 2018

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

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

Пример кода ниже:

function myCustomDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalValue = descriptor.value;
  descriptor.value = function(...args: any[]) {
    const result = originalValue.apply(target, ...args);
    //Do some other stuff
    return result;
  }
  return descriptor;
}

@Component()
class myComponentClass implements OnInit {
  constructor(private myService: MyService) {}

  ngOnInit() {
    this.functionIWantToDecorate();
  }

  @myCustomDecorator
  private functionIWantToDecorate() {
    this.myService.someServiceFunction();
  }
}

Вызывает ошибку «Не удается вызвать someServiceFunction of undefined».Любые идеи о том, как заставить это работать?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Если вы немедленно возвращаете дескриптор из вашего декоратора, вы не должны использовать фигурные скобки ().Также контекст this потерян, попробуйте использовать this, который находится в значении дескриптора.Кроме того, когда вы используете apply, вы не должны использовать оператор распространения.Если вы хотите использовать это, вы должны использовать call:

function myCustomDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalValue = descriptor.value;
  descriptor.value = function(this: Function, ...args: any[]) {
    const result = originalValue.call(this, ...args);
    // or --> const result = originalValue.apply(this, args);
    //Do some other stuff
    return result;
  }
  return descriptor;
}
0 голосов
/ 04 июня 2018

Проблема, с которой вы сталкиваетесь, вызвана тем фактом, что внутри декоратора target находится класс, а не экземпляр класса.Декораторы применяются при создании класса и, следовательно, не могут иметь доступ к экземпляру при их вызове.Вы можете получить доступ к текущему объекту, когда функция фактически вызывается:

descriptor.value = function(...args: any[]) {
  const result = originalValue.apply(this, ...args); // this not target 
  //Do some other stuff
  return result;
}
...