Пользовательские декораторы Typescript: контекст этого - PullRequest
0 голосов
/ 29 августа 2018

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

Пока все хорошо: моя проблема возникает, когда функция действительно запускается: контекст объекта this потерян.

Я искал решение для прошедшего дня, но не могу найти его.

Вот блик стека , воспроизводящий проблему. Цель состоит в том, чтобы увидеть Angular в консоли, идущей от this.name.

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

в https://netbasal.com/inspiration-for-custom-decorators-in-angular-95aeb87f072c нет

constructor.prototype.HelloWord.apply(this, null);

просто прокомментируйте строку работы вашего приложения

используется cosntructor.prototype для возможного использования ngOnInit, ngOnChanges ...

например показать на странице

import { environment } from "../environments/environment";
export function NgLog() : ClassDecorator {
  return function ( constructor : any ) {
    if( !environment.production ) {
      // You can add/remove events for your needs
      const LIFECYCLE_HOOKS = [
        'ngOnInit',
        'ngOnChanges',
        'ngOnDestroy'
      ];
      const component = constructor.name;

      LIFECYCLE_HOOKS.forEach(hook => {
        const original = constructor.prototype[hook];

        constructor.prototype[hook] = function ( ...args ) {
          console.log(`%c ${component} - ${hook}`, `color: #4CAF50; font-weight: bold`, ...args);
          original && original.apply(this, args);
        }
      });
    }

  }
}
0 голосов
/ 29 августа 2018

Пожалуйста, попробуйте ниже код, он будет работать. Слышать, у вас есть только изменить это конструктор.

function HelloWorld(): ClassDecorator {
  return function(constructor) {
    constructor.prototype.HelloWorld.apply(new constructor(), null);
  };
}
0 голосов
/ 29 августа 2018

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

Вот ваш обновленный стек . Я расширяю ваш класс и вызываю метод в конструкторе расширенного класса, чтобы он вызывался всякий раз, когда создаются экземпляры объектов украшенного класса.

...