update - dynamic title angular




Service-Instanz ohne Konstruktor-Injection erhalten (2)

Ich habe einen @Injectable Dienst in Bootstrap definiert. Ich möchte die Instanz des Dienstes erhalten, ohne die Konstruktorinjektion zu verwenden. Ich habe versucht, ReflectiveInjector.resolveAndCreate aber das scheint eine neue Instanz zu erstellen.

Der Grund, warum ich das versuche, ist, dass ich eine Basiskomponente habe, die von vielen Komponenten abgeleitet ist. Jetzt muss ich auf einen Service zugreifen, möchte ihn aber nicht zum ctor hinzufügen, da ich den Service nicht auf alle abgeleiteten Komponenten anwenden möchte.

TLDR: Ich benötige einen ServiceLocator.GetInstance<T>()

UPDATE: Aktualisierter Code für RC5 +: Speichern der Injektorinstanz zur Verwendung in Komponenten


Ein anderer Ansatz würde darin bestehen, einen benutzerdefinierten Dekorator zu definieren (ein CustomInjectable , um die Metadaten für die Abhängigkeitsinjektion CustomInjectable :

export function CustomComponent(annotation: any) {
  return function (target: Function) {

    // DI configuration
    var parentTarget = Object.getPrototypeOf(target.prototype).constructor;
    var parentAnnotations = Reflect.getMetadata('design:paramtypes', parentTarget);

    Reflect.defineMetadata('design:paramtypes', parentAnnotations, target);

    // Component annotations / metadata
    var annotations = Reflect.getOwnMetadata('annotations', target);
    annotations = annotations || [];
    annotations.push(annotation);
    Reflect.defineMetadata('annotations', annotations, target);
  }
}

Es nutzt die Metadaten des übergeordneten Konstruktors anstelle seiner eigenen. Sie können es für die untergeordnete Klasse verwenden:

@Injectable()
export class SomeService {
  constructor(protected http:Http) {
  }
}

@Component()
export class BaseComponent {
  constructor(private service:SomeService) {
  }
}

@CustomComponent({
  (...)
})
export class TestComponent extends BaseComponent {
  constructor() {
    super(arguments);
  }

  test() {
    console.log('http = '+this.http);
  }
}

Siehe diese Frage für weitere Details:


In dem aktualisierten Winkel, in dem ngModules verwendet werden, können Sie eine Variable erstellen, die an einer beliebigen Stelle im Code verfügbar ist:

export let AppInjector: Injector;

export class AppModule {
  constructor(private injector: Injector) {
    AppInjector = this.injector;
  }
}




angular2-injection