2017-06-06 3 views
2

In meiner Angular-App verwende ich einen gemeinsam genutzten Dienst, bei dem es sich nicht um ein Singleton handeln muss, da die Daten ständig aktualisiert werden.Angular 4.1.3 Bei Verwendung von AOT kehrt Service Factory undefined zurück

Service Factory:

import {DataService} from '../../../../shared/services/data.service'; 
import {Http} from '@angular/http'; 

export const DataServiceProvider = { 
    provide: DataService, 
    useFactory(http: Http) { 
     return new DataService(http); 
    }, 
    deps: [Http] 
}; 

Wenn ich die app in JIT-Modus ausgeführt, die Fabrik funktioniert gut, aber wenn ich mit der --aot Flagge bauen, ich die folgenden Fehlermeldung.

Der zurückgegebene Dienst verfügt über eine Methode get(), die einen Aufruf an den Server sendet. Ich verstehe nicht, was in AOT diese scheinbar einfache Funktionalität bricht.

Weitere Referenz, spritze ich den Dienst im Konstruktor:

construct(
    dataService: DataService 
) { 
    super(); 
} 

Und es in ngOnInit nennen():

ngOnOnit() { 
    this.subscribe(this.dataService.get(), (res) => { this.data = res }); 
} 

ich einige Abonnement-Funktionalität haben weg von meiner Komponente abstrahiert, die handhaben Abmelden, um Speicherlecks zu verhindern, weshalb dieser Code so seltsam aussehen könnte.

Antwort

2

Damit AOT funktioniert, müssen alle Funktionen statisch auswertbar sein. Weitere Informationen finden Sie unter this Medium article. Da Sie ein Objekt exportieren und dieses Objekt eine anonyme Funktion aufweist, versuchen Sie, die Funktion ebenfalls zu exportieren. Aktualisieren Sie Ihre Fabrik wie folgt aus:

import {DataService} from '../../../../shared/services/data.service'; 
import {Http} from '@angular/http'; 

export const DataServiceProvider = { 
    provide: DataService, 
    useFactory: dataServiceProviderUseFactory, 
    deps: [Http] 
}; 
export function dataServiceProviderUseFactory(http: Http) { 
    return new DataService(http); 
} 
+1

ich mit AOT dachte, die angeblich auf der Kompilierung zum Scheitern verurteilt, wenn sie nicht analysiert werden konnte. Ich hatte den Code von const factoryFunction geändert = (http: Http) => return new DataService; wegen der Kompilierfehler, aber ich hätte nie gedacht, die Funktion zu exportieren! Danke vielmals. – user1119648

Verwandte Themen