2016-05-05 6 views
3

Ich versuche, einen selbst erstellten Dienst & der Angular2 Http-Dienst in meinen benutzerdefinierten HttpRest-Dienst zu injizieren.Einfügen mehrerer Dienste in einen Dienst - angular2

@Inject(Http) public _http: Http 

mit funktionierte gut, aber wenn ich versuche, einen anderen Eigenbau Service zu injizieren i Fehler erhalten folgende:

EXCEPTION: Cannot resolve all parameters for 'HttpRest'(Http @Inject(Http), undefined @Inject(undefined)). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'HttpRest' is decorated with Injectable. 

Aus irgendeinem Grund UserIds nicht definiert ist, auch wenn der Import erfolgreich. Mein individueller Service:

@Injectable() 
export class UserIds{ 
    private _signature_id:string; 
    private _role_id:number; 
    get signature_id():string{ 
     return this._signature_id; 
    } 
    set signature_id(id:string){ 
     this._signature_id = id; 
    } 
    get role_id():number{ 
     return this._role_id; 
    } 
    set role_id(id:number){ 
     this._role_id = id; 
    } 
} 

Den Brauch HttpRest Service im sowohl Http & UserIds in Injektion:

@Injectable() 
export class HttpRest{ 
    groups; 
    constructor(
     @Inject(Http) public _http: Http, 
     @Inject(UserIds) public _ids: UserIds 
    ){} 
... 
} 

HINWEIS! Wenn ich entferne

, 
@Inject(UserIds) public _ids: UserIds 

Ich bekomme nicht den Fehler.
Was fehlt mir?

UPDATE Das Problem ist eigentlich, dass UserIds in den Konstruktor params aus einem unbekannten Grund nicht definiert ist, das zu verstehen, im Versuch, so der Titel dieser Frage irrelevant. Es sollte "Importierter Dienst ist in Konstruktorparametern nicht definiert" sein.
Bitte beziehen Sie sich auf meine Antwort auf diese Frage weiter unten in diesem Post.

UPDATE:
Bitte reffer auf eine Frage, die dieses Thema diskutiert. Using index.ts file to export class causes undefined in injected constructor

Antwort

0

Sie benötigen UserIds Dienst auf Root-Ebene (main.ts) oder im app.component.ts, registrieren, die die höchste Ebene in der Hierarchie ist:

@Component({ 
    selector: 'my-app', 
    template: '<h1>My First Angular 2 App</h1>', 
    providers: [ UserIds ] 
}) 
export class AppComponent { } 
+0

Ich tat das ohne Ergebnis. @Component ({ Wähler: "... " templateUrl:" ...", Richtlinien: [ ROUTER_DIRECTIVES ], Anbieter: [ ROUTER_PROVIDERS, HttpRest, UserIds, liefern (LocationStrategy, {useClass: HashLocationStrategy}) ] }) – wagwanJahMan

1

@Inject(...) in @Inject(Http) public _http: Http ist überflüssig, wenn die Parameter zu @Inject() ist der gleiche wie der Typ des Parameters.

@Injectable() 
export class HttpRest{ 
    groups; 
    constructor(public _http: Http, public _ids: UserIds 
    ){} 
... 
} 

Sie müssen Http bieten und UserIds so DI ist in der Lage, die Abhängigkeit zu lösen. Http in HTTP_PROVIDERS

@Component({ 
    selector: '...', 
    providers: [HTTP_PROVIDERS, UserIds], 
    template: ... 
}) 
export class AppComponent { 

} 

enthalten ist Vergewissern Sie sich alles

import {HTTP_PROVIDERS, Http} from 'angular2/http'; 
+0

Das Problem ist eigentlich, dass UserIds in den Konstruktorparametern aus einem unbekannten Grund, den ich zu verstehen versuche, undefiniert ist, so dass der Titel dieser Frage irrelevant wird. Es sollte "Importierter Dienst ist in Konstruktorparametern nicht definiert" sein. Das passiert, obwohl ich, wenn ich die importierte Klasse in einem Mitglied speichern, kann ich es im Konstruktor Ausführungskontext zugeordnet sehen. – wagwanJahMan

+0

Haben Sie jede Klasse in einer eigenen Datei. Wenn Sie einen Klassennamen verwenden, der sich in der gleichen Datei befindet, wird es nicht funktionieren. Klassen werden nicht gehisst. Sonst ist ein Import kaputt. Andernfalls wäre es hilfreich, einen Plunker zu haben, der es erlaubt zu reproduzieren (Vorlage https://plnr.co/edit/KZu83k?p=info) –

+1

Die Klasse ist in einer eigenen Datei, die eine einzelne Klasse exportiert. Ich werde jedoch einen Plünderer erstellen, um das Problem zu zeigen, und es als eine neue Frage veröffentlichen. Ich werde diesen Beitrag dann mit einem Link zu dieser Frage aktualisieren. Momentan füge ich hier einen Aktualisierungskommentar zur Hauptfrage hinzu, da der Titel für dieses Problem irrelevant ist. – wagwanJahMan

1

Ok, so habe ich das Problem richtig importiert haben, und es hat nicht mit Inject zu tun. Das Problem war, dass ich eine Indexdatei zum Exportieren von Diensten, wie in der angular 2 Styleguide (https://github.com/mgechev/angular2-style-guide/blob/master/old/README.md#directory-structure) erwähnt, verwenden und aus irgendeinem Grund einen bestimmten Wert aus dem Index importieren verursacht einen undefinierten Wert, wenn in den Konstruktor injiziert. Als ich die Quelle direkt und nicht durch die Indexdatei referenzierte, aus einem Grund, der unbekannt ist, löste der Fehler.

Der Import vor dem Update, sah dies wie:

import {UserIds} from "../index"; 

, die mit allen anderen Diensten und Komponenten gearbeitet.

Der Import der direkte Quelldatei mit:

import {UserIds} from "../user_ids/user_ids.service"; 

Aus irgendeinem Grunde das ist mein Problem gelöst, aber ich mag mit der index.ts Verkapselung konsistent bleiben.

Wenn jemand eine Idee hat, warum das passieren könnte, werde ich mich über Updates freuen.

+0

Ich lief gerade in das gleiche Problem. Danke für die Lösung, aber ich frage mich auch, was das Problem ist .. Ich möchte nicht direkt auf meine Klassen verweisen, aber stattdessen baue ich Fässer .... – Spock

Verwandte Themen