2016-03-29 3 views
3

Ich habe ein Problem, das meiner Meinung nach durch eine zirkuläre Abhängigkeit verursacht wird. Nach einigen umfangreichen Recherchen konnte ich keine Lösung finden. Es sieht im Zusammenhang mit diesem Problem: TypeError: b is undefined in __extends in TypeScript, aber es hat mir nicht geholfen.Kreisförmige Abhängigkeit mit Angular 2 und SystemJS

Ich konnte das Problem in this plunker vereinfachen.

Grundsätzlich gibt es 3 Klassen:

  • die Klasse A, die ein Array von A
  • die Klasse B enthält, die aus A
  • die Klasse erbt F, eine Fabrik, die eine schaffen A oder B abhängig von einem Wert

T Der Zweck davon ist die Handhabung einer Parameterliste, die dynamisch sein kann (jeder A ist ein Parameter und kann ein Array sein) und wobei B eine Spezialisierung von A ist, um Dateien zu handhaben. Ich habe versucht, das Werk zu entfernen, aber mit nur A und B ich immer noch den gleichen Fehler:

TypeError: b is undefined Error loading http://localhost:3000/app/main.js

Hier ist der Code von a.ts

import { F } from './f'; 

export class A { 
    children: A[] 

    constructor(hasChildren: boolean = false) { 
    if (hasChildren) { 
     for (var i = 0 ; i < 10 ; ++i) { 
     let isB = (Math.random() * 2) > 1; 
     this.children.push(F.createObject(isB)) 
     } 
    } 
    } 
} 

b.ts

import { A } from './a'; 

export class B extends A { 
} 

und f.ts

import { A } from './a' 
import { B } from './b' 

export class F { 
    static createObject(isB: boolean): A { 
    if (isB) { 
     return new B 
    } else { 
     return new A 
    } 
    } 
} 
+0

Wo ist die Linie, die die 'b' in der Fehlermeldung erwähnt enthalten? –

+0

In der JavaScript-Konsole. Wenn die Klassen "toto" und "tata" heißen, lautet die Fehlermeldung immer noch "TypeError: b ist undefined Fehler beim Laden von http: // localhost: 3000/app/main.js" – Sunder

+0

Der Plunker-Link funktioniert nicht mich. –

Antwort

3

Sie können keine zirkuläre Abhängigkeit auf diese Weise haben. Sie können über eine Schnittstelle

Plunker example

tata.ts

import { IToto } from './itoto'; 


export class Tata implements IToto { 
    children: Toto[] 
} 

toto.ts

import { Tata } from './tata'; 
import { IToto } from './itoto'; 

export class Toto implements IToto{ 
    children: Toto[] = []; 

    constructor(hasChildren: boolean = false) { 
    ... 
    } 
} 

itoto.ts

Umgehen
export interface IToto { 
    children: Toto[] 
} 

Siehe auch Circular dependency injection angular 2

+2

Ich verstehe es nicht - Itoto importiert sich selbst? – itamar

+0

ja das ist verwirrend, nicht bekommen es auch ... – Starwave

+0

Ich habe eine Antwort auf diesen Beitrag http://stackoverflow.com/a/41807260/6903440 geschrieben –