2017-03-14 3 views
1

Ich entschuldige mich im Voraus dafür, dass ich keinen Plunder für diesen Code erstellt habe. Es gibt eine Reihe von Steuerelementen von Drittanbietern, die für die Ausführung benötigt werden.Wie wird ein injizierbarer Winkelservice zur Laufzeit ermittelt?

Meine Frage bezieht sich auf die Auswahl von Service, Abhängigkeitsinjektion zur Laufzeit, basierend auf einigen Bedingungen.

wir diskutieren nur einen Dienst für dieses Beispiel.

import { Injectable } from '@angular/core'; 
import { Http, Response} from '@angular/http'; 

@Injectable() 
export class Service1 { 
    constructor (
     private http: Http) { 
    } 
} 

In meiner Komponente, wenn ich eine feste habe, ist alles in Ordnung.

import {Component, ViewChild, OnChanges, Input, ReflectiveInjector, SimpleChange} from '@angular/core'; 
import {Observable} from 'rxjs/Rx'; 
import { Service1 } from './my.service.1'; 
@Component({ 
    providers: [ 
     Service1 
    ], 
    moduleId: module.id, 
    selector: 'my-component', 
    templateUrl: './my-component.component.html' 
}) 
export class MyComponent { 
    constructor(private service : Service1 
     ) { 
} 

im obigen Fall ist alles gut, keine Laufzeitfehler.

Jetzt, wenn ich auf die dynamische Version ändern, erhalte ich einen Fehler AUSNAHME: Fehler in http://localhost:3000/app/app.component.html:5:8 verursacht durch: Kein Anbieter für Http! (Service1 -> Http)

die Version von Code den Fehler verursacht ist:

Ich habe eine Membervariable für MyComponent: privat Service: any = '';

und der Konstruktor sieht nun wie

constructor() { 

    // this does not work with the http module 
    let injector = ReflectiveInjector.resolveAndCreate([Service1]); 
    this.service = injector.get(Service1); 
} 

jemand sieht, was die oben genannten Fehler verursacht?

Antwort

0

nicht vergessen Http an das Array in ReflectiveInjector.resolveAndCreate weitergegeben hinzuzufügen:

let injector = ReflectiveInjector.resolveAndCreate([Service1,Http]); 
+0

Keine Änderung, nachdem ich Ihre Empfehlung hinzugefügt. – reza

+0

Entschuldigung, ich habe nur nach dir gesucht, es ist schwierig, weil Http seine eigenen Abhängigkeiten hat und diese Abhängigkeiten ihre Abhängigkeiten haben, also musst du alle diese Abhängigkeiten dem 'ReflectiveInjector' zur Verfügung stellen, um deinen' Service1' zu bekommen. Sehen Sie sich hier https://github.com/mgechev/injection-js an –