2017-02-23 6 views
5

Ich habe versucht, meine App auf AoT-Kompilierung umzustellen und habe diesen Fehler in der Produktionsumgebung bekommen, als die App geladen wurde (es funktioniert gut lokal).Angular2 - Fehler: Ich kann nicht alle Parameter für IconService auflösen

Error: Can't resolve all parameters for IconService: (?, ?)

scheint es, wie die Fehler aus auf den Modulen kommen, der die IconService bereitstellt. Die Symbole Dienste Konstruktor sieht aus wie

constructor(private http:Http, private iconConfiguror:IconConfiguror) {

Also meine Frage ist, was wird dieser Fehler bedeuten und warum es nur in der prod Umgebung passieren würde (ich habe lokal prod Modus versucht ermöglicht)?

Es scheint, wie es bedeutet, dass die http und Symbol Konfigurationsparameter nicht zur Verfügung gestellt werden, aber das Symbol Config an der App Modulebene zur Verfügung gestellt und die HttpModule in den IconModule importiert, wo die IconService vorgesehen ist.

@NgModule({ 
    imports: [ 
     CommonModule, 
     HttpModule, 
    ], 
    declarations: [ 
     IconComponent, 
    ], 
    exports: [ 
     IconComponent, 
    ], 
    providers: [ 
     IconService, 
     __platform_browser_private__.BROWSER_SANITIZATION_PROVIDERS, 
    ], 
}) 

Und das Fass für unsere Icon-Komponente.

export * from "./components/icon/icon.configuror"; 

export * from "./components/icon/icon.service.provider"; 

export * from "./components/icon/icon.service"; 

export * from "./components/icon/icon.component"; 

export * from "./components/icon/icon.module"; 
+0

'Konstruktor (private http: Http, private iconConfiguror: IconConfiguror)' – Alex

+1

@ AJT_82 vergessen zu aktualisieren, ich habe das auch versucht. – tallkid24

+0

Das '__decorate' ist korrekt, sie sollten dort nicht injiziert werden. Wie stellen Sie den IconConfiguror Service zur Verfügung? – altschuler

Antwort

5

Dies wurde behoben, indem der IconService auf andere Weise bereitgestellt wurde. Ich musste es als Abhängigkeit erklären

{ 
     provide: IconService, 
     useFactory: iconServiceFactory, 
     deps: [Http, IconConfiguror], 
    }, 

und die Fabrik selbst

export function iconServiceFactory(http: Http, iconConfiguror: IconConfiguror) { 
    return new IconService(http, iconConfiguror); 
} 

ich aus irgendeinem Grund denke, die Http nicht zur Verfügung gestellt wurde (obwohl Httpmodule importiert wurde) so.

2

Ich habe ähnliches Problem festgestellt. Ich löste es, indem ich die Exportordnung im Fass änderte.

Basisdienstdateien:

// dependency.service.ts 
@Injectable() 
export class DependencyService { } 

// dependant.service.ts 
import { DependencyService } from '.'; 

@Injectable() 
export class DependantService { 
    constructor(private dependency: DependencyService) { } 
} 

Nach Lauf verursacht den Fehler:

// index.ts 
export * from './dependant.service'; 
export * from './dependency.service'; 

Während auf folgende Werke:

// index.ts 
export * from './dependency.service'; 
export * from './dependant.service'; 
+0

Ich habe gerade dieses Problem erlebt, und ich frage mich, ob Sie wissen, warum es passiert? –

+0

@JacquesCornat Ich habe es nicht untersucht. Zumindest finde ich logisch, dass die Abhängigkeitsreihenfolge korrekt sein muss. Allerdings vermute ich, wie Dekorateure verarbeitet werden. – LoganMzz

1

Manchmal einzige Weg ist, um es zu beheben - manuell beschreiben Parameter.

static get parameters() { return [Http, IconConfiguror] } 

constructor(private http:Http, private iconConfiguror:IconConfiguror) { 
5

Eine mögliche Ursache für diesen Fehler ist, wenn Sie nicht mit @Injectable() Ihre IconService Klasse schmücken. Wenn dies der Fall ist, wird der Fehler durch Hinzufügen der Dekoration oberhalb der Klassendeklaration behoben.

0

für mich gearbeitet, wenn ich folgende verwendet, während der Dienst in app.module.ts Import

{provide: AuthService, 
    depends: HttpClientModule} 
0

Mein Problem war, dass ich von einer Basisklasse wurde erben, und ich hatte diese Basisklasse mit @Injectable dekoriert . Die erbende Klasse war die Klasse, die das @ Injectable-Attribut und nicht die Basisklasse haben sollte. Es sieht so aus, als ob der Compiler die @Injectable-Eigenschaft erkennt, um sicherzustellen, dass alle Eigenschaften im Konstruktor eingefügt werden können. Wenn nicht, ist es ein Fehler.Ich löste es, indem ich die @Injectibable-Eigenschaft aus dieser Klasse entfernte.

Verwandte Themen