以角度创建自定义装饰器

时间:2018-09-19 13:11:51

标签: angular typescript angular-decorator

我正在尝试创建返回一个类的新实例的自定义装饰器,并且该类必须从注入的服务创建,而我无法弄清楚如何从装饰器函数访问它

自定义装饰器

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);
  }
}

更新

这里是stackblitz reproduction

1 个答案:

答案 0 :(得分:0)

您从字段修饰符返回的值将不会用作您假设的字段的值。

您可以通过返回属性描述符来将字段更改为装饰器中的属性,该描述符将进行调用以获取属性的值。

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
  };
}