Angular 2 - 将依赖项注入装饰器工厂

Mer*_*ott 9 dependency-injection decorator typescript angular

有没有办法使用Angular的DI将依赖项注入装饰器工厂?我们将以下代码作为简化示例:

@Component({
  selector: 'hello-component',
  template: '<div>Hello World</div>'
})
export class HelloComponent {
  @PersonName()
  name: string;

  ngAfterViewInit() {
    console.log(`Hello, ${this.name}`);
  }
}
Run Code Online (Sandbox Code Playgroud)

这里,PersonName装饰器的预期行为是它访问Person依赖项,并使用它来设置name类的属性.

是否有可能PersonName为上面的代码实现装饰器?

lex*_*ren 9

目前,要将依赖项注入我的装饰器(以及其他额外的模块类),我正在使用此解决方法:

import {Injectable, Injector} from "@angular/core";
@Injectable()
export class ExtraModuleInjector {
  private static injector;

  public static get(token: any) {
    if (ExtraModuleInjector.injector) {
      return ExtraModuleInjector.injector.get(token);
    }
  }

  constructor(public injector: Injector) {
    ExtraModuleInjector.injector = injector;
  }
}
Run Code Online (Sandbox Code Playgroud)

在注入根组件后,它允许使用静态get方法在运行时函数执行期间获取依赖关系.仍在寻找更好的解决方案.


Sas*_*sxa 5

这样做有点棘手,因为装饰器是在构建时执行的,而不是在运行时执行。当执行装饰器时,没有该类的实例。

回到 ng2.beta.10,我用它从服务中获取数据(不要认为你可以从组件中获取数据,但我可能是错的......):

// some-route.ts
@CanActivate((next, prev) => {
  let store: any = getSingleton(Store);
})

// injector.ts
import {Injector} from 'angular2/core'

let appInjectorRef: Injector;

export const appInjector = (injector?: Injector) => {
  if (injector)
    appInjectorRef = injector;
  return appInjectorRef;
}

export function getSingleton(token: any) {
  let injector: Injector = appInjector();
  return injector.get(token);
}
Run Code Online (Sandbox Code Playgroud)

..说实话,现在看这段代码我不知道它是如何工作的(;但我知道当时确实如此。不确定现在的状态,或者自 beta.10 以来是否有任何与注入器相关的重大更改和应用参考...