Создать кастом декоратор в угловой - PullRequest
0 голосов
/ 19 сентября 2018

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

Пользовательский декоратор

export function Collection(endpoint: string) {
  return function (constructor: any) {
    const mainService = CollectionModule.injector.get(MainService);
    return mainService.getCollection(endpoint);
  };
}

Я хочу получить доступ к MainService из своего пользовательского декоратора, который я пытался использовать, но свойство injector не существует!

Служба

@Injectable()
export class MainService {

  config;

  getCollection(endpoint: string): Collection {
    return new Collection(endpoint, this.config);
  }
}

Ожидаемое использование

export class AppComponent implements OnInit {

  @Collection('posts') postsCollection;


  ngOnInit() {
     console.log(this.postsCollection);
  }
}

Обновление

Вот воспроизведение стекаблика

1 Ответ

0 голосов
/ 19 сентября 2018

Значение, которое вы возвращаете из декоратора поля, не будет использоваться в качестве значения для поля, как вы предполагаете.

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

export function Collection(endpoint: string) {
  return function (constructor: Object, propertyName: string) {
    let descriptor: PropertyDescriptor = {
      get(this: any){
        const mainService = this["_" + propertyName] || (this["_" + propertyName] =  CollectionModule.injector.get(MainService);
        return mainService
      }
    }
    return descriptor
  };
}
...