2017-05-19 1 views
1

Ich frage mich, warum Angular 2 Anbieter Syntax funktioniert nicht, wenn ich einen bestimmten Wert über das useValue Feld zur Verfügung stellen möchten.Angular 2 Anbieter arbeitet nicht mit useValue und Funktionsaufruf an neuen

Zum Beispiel in den app.module.ts I

// Abstracted base class (since interfaces don't work with libraries and tsc) 
export class Base { 
    constructor(public bar:Bar) { 
    } 
} 

export class Foo extends Base { 
    constructor(public bar:Bar) { 
    super(bar); 
    } 
} 

export class Bar { 
    hello = "world"; 
} 

@NgModule({ 
    declarations: [ 
    AppComponent, 
    ], 
    imports: [ 
    ], 
    providers: [ 
    {provide: Base, useValue: new Foo(new Bar())} 
    ], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { 
} 

Der Versuch, dies wirft einen Fehler bei ng build haben:

ERROR in Error encountered resolving symbol values statically. Calling function 'Foo', function calls are not supported. Consider replacing the function or lambda with a reference to an exported function, resolving symbol AppModule in /Users/tbeauvais/Code/example-sdk/src/app/app.module.ts, resolving symbol AppModule in /Users/tbeauvais/Code/example-sdk/src/app/app.module.ts 

Ich bin immer um diese, indem einfach das Feld, useClass und dann die Parameter über deps wie folgt eingeben:

... 
providers: [ 
    Bar, 
    {provide: Base, useClass: Foo, deps:[Bar]} 
], 
... 

Es funktioniert, es ist einfach nicht ideal und ich frage mich, was mir hier fehlt. Außerdem möchte ich Bar ohne Grund nicht injizieren müssen.

Jede Hilfe würde sehr geschätzt werden. Prost!

+0

Sie sollten überprüfen: https://github.com/rangle/angular-2-aot-sandbox – echonax

Antwort

3

Ich weiß, dass der Fehler kryptisch klingt, aber am Ende des Tages ist es nicht. Einige Konfigurationen (normalerweise aot-cli) erlauben keinen Code, der nicht statisch analysiert werden kann. Um das zu tun, dass man eine Funktion, ebenso wie die Fehlerzustände zu exportieren hat, wie diese

eine ts-Datei erstellen, wie diese

export function UseClassFunction(){ return function() { return new Foo(new Bar());}} und importieren Sie dann das und verwenden Sie es auf useValue

sieht

{provide: Base, useValue: UseClassFunction}

Verwandte Themen