2016-04-22 8 views
0

Situation:Lazy Loading mit DI in Basisklasse

Ich habe eine Basisklasse Base. Main erweitert Base. Main übergibt einen Service an Base über super(). Base ruft dann eine Methode für diesen Dienst auf.

Problem:

Der Service ist undefined in Base. Es sei denn ich console.log(_service) vorher in der Basisklasse. Ich vermute eine Race-Bedingung, die mit dem Lazy-Laden über AsyncRoute zusammenhängt, oder vielleicht ist es ein Instanziierungsproblem ... so oder so, ich bin mir nicht sicher, wie ich überhaupt anfangen soll, es zu korrigieren.

Main.ts:

export class Main extends Base { 
    constructor(private _service:SomeService) { 
     super(this._service); 
    } 
} 

Base.ts:

@Injectable() 
export class Base { 
    constructor(_service) { 
     _service.doSomething(true); 
    } 
} 

Der Code bläst bei _service.doSomething(true) mit Fehler auf:

EXCEPTION: Error during instantiation of Main!

ORIGINAL EXCEPTION: TypeError: Cannot read property 'doSomething' of undefined

Aber wenn ich versuche, zu verfolgen warum _service ist undefiniert folgendes tun - magisch funktioniert es ???

Base.ts:

@Injectable() 
export class Base { 
    constructor(_service) { 
     console.log("_service?", _service); // if this is here... 
     _service.doSomething(true); // ...then the error no longer occurs here 
    } 
} 

Antwort

0

Das Problem war, dass ich einen statischen Dienst verwendete, also hätte ich SomeService.doSomething() tun sollen anstatt zu versuchen, es wie _service:SomeService instanziieren.

Das ist, warum die console.log "repariert" es - es wurde in der console.log() Anweisung instanziiert, und dann bestand rechtzeitig für die tatsächliche Nutzung davon.

1

Sie können Schnittstelle für den Dienst verwenden, um dieses Problem zu beheben, wie folgt.

interface IService{ 
    doSomething(); 
} 

Ändern Sie jetzt die Basisklasse wie folgt.

export class Base { 
constructor(_service: IService) { 
    _service.doSomething(true); 
    } 
} 

Hinweis: Die SomeService sollte IService Hoffnung setzt dies Ihr Problem lösen wird.

+0

Ich sollte die Serviceklasse enthalten - es war statisch, das war das Problem. Siehe meine Antwort. Danke für die Hilfe. – oooyaya