2016-10-03 5 views
10

Ich versuche meine Ionic2.beta11 App auf die neue Version Ionic2.rc0 zu portieren. Die meisten Dinge waren ziemlich geradlinig, aber ich habe ein Problem mit dem AoT-Compiler.Wie kann ich ein Argument an einen Provider-Konstruktor in Ionic2/Angular2 übergeben?

Ich habe eine AuthService:

@Injectable() 
export class AuthService { 
    constructor(@Inject(Http) http: Http) { 
    this.http = http; 
    } 
    ... 
} 

ich es in meine app in der src/app/app.module.ts Datei bin Injektion:

@NgModule({ 
    declarations: [ 
    MyApp, 
    ... 
    ], 
    imports: [ 
    IonicModule.forRoot(MyApp) 
    ], 
    bootstrap: [IonicApp], 
    entryComponents: [ 
    MyApp, 
    ... 
    ], 
    providers: [ 
    AuthService 
    ] 
}) 

Alles funktioniert gut, wenn ionische läuft dienen, aber wenn ich versuche zu bauen es bekomme ich folgende Fehlermeldung:

ngc error: Error: Error at .../.tmp/app/app.module.ngfactory.ts:397:78: Supplied parameters do not match any signature of call target. 

Linien 396-399:

get _AuthService_74():import44.AuthService { 
    if ((this.__AuthService_74 == (null as any))) { (this.__AuthService_74 = new import44.AuthService()); } 
    return this.__AuthService_74; 
} 

Das Problem ist, dass new import44.AuthService() ein Argument des Typs http erwartet.

Die interessante Sache ist, dass alles gut funktioniert, wenn ich manuell constructor(http: Http) durch constructor() in der Definitionsdatei ersetze.

Ich las alle StackOverflow-Antworten, die ich finden konnte, aber keine der Lösungen löste mein Problem.

Muss ich den Konstruktor im AuthService ändern oder wie ich es in meine App injiziere? Danke für Ihre Hilfe.

+0

Als temporäre Lösung, die ich das Argument optional und es funktioniert jetzt gemacht. Aber ich suche immer noch nach einer richtigen Lösung. –

Antwort

0

Import HttpModule von @angular/http in der App-Modul wie folgt:

import { HttpModule } from '@angular/http'; 
@NgModule({ 
    declarations: [ 
    MyApp, 
    ... 
    ], 
    imports: [ 
    HttpModule, 
    IonicModule.forRoot(MyApp) 
    ], 
    bootstrap: [IonicApp], 
    entryComponents: [ 
    MyApp, 
    ... 
    ], 
    providers: [ 
    AuthService 
    ] 
}) 

Ihren Dienst ändern, wie unten und überprüfen Sie einmal:

import { Http } from '@angular/http'; 
@Injectable() 
export class AuthService { 
    constructor(private http: Http) { 
    } 
    ... 
} 
+0

Danke für Ihre schnelle Antwort, aber ich bekomme immer noch genau das gleiche Problem. –

+0

Die Bearbeitung hat auch nicht funktioniert. Beim Kompilieren des neuen AuthService benötigt der Konstruktor immer noch 1 Argument (in der kompilierten js und der d.ts Datei). Aber weil es funktioniert, wenn ich die Definitionsdatei anpasse, denke ich, dass alles auf der JS-Seite gut funktioniert. Es muss etwas an der Art und Weise, wie ich es injiziere, falsch sein. –

8

Sie haben die Art und Weise zu ändern, wie Sie den Anbieter definieren :

@NgModule({ 
    ... 
    providers: [ 
    Http, 
    { 
     provide: AuthService, 
     useFactory: getAuthService, 
     deps: [Http] 
    } 
    ] 
}) 

Das letzte Stück ist die Werksfunktion:

export function getAuthService(http: Http): LoggingService { 
    return new AuthService(http); 
} 

Siehe auch Migrating to Ionic 2 RC 0 - ngc fails

1

Ich hatte das gleiche Problem & Markus mich auf dem richtigen Weg, aber hier ist es, was ich in Gang zu bringen tun musste (siehe auch „Factory-Anbieter“ unter Angular docs Dependency Injection):

Machen Sie den Konstruktorparameter im injizierten Service optional. Dies allein reicht nicht aus (http wurde zur Laufzeit nicht definiert)

constructor(public http?: Http){} 

eine Service-Provider-Klasse SomeServiceProvider.ts erstellen:

import { Http } from '@angular/http'; 
import { SomeService } from 'some-service'; 

export function someServiceFactory(http: Http){ 
    return new SomeService(http); 
} 

export let SomeServiceProvider = 
    { provide: SomeService, 
    useFactory: someServiceFactory, 
    deps: [ Http ] 
    }; 

im Stamm app.component.ts, fügen Sie die Service-Provider:

@Component({ 
    ... 
    providers: [ SomeServiceProvider ] 
}) 

entfernen den Dienst von dem @NgModule Anbieter in app.module.ts.

Um den Dienst in Komponenten zu verwenden, ist es von Injector eher erhalten, als den Dienst Injektion:

import { Component, Injector } from '@angular/core'; 
import { SomeService } from 'some-service'; 

@Component({ 
    ... 
}) 

export class MyComponent{ 
    someService: SomeService = this.injector.get(SomeService); 

    constructor(private injector: Injector) {} 

} 
Verwandte Themen