2016-05-17 21 views
0

Ich versuche, circular abhängige Komponenten in angular2 arbeiten. Was bisher aus der Box funktioniert, ist rekursive Komponenten (die nicht so leicht in angular1 funktioniert hat):Angular 2 kreisförmige Komponenten

@Component({ 
    selector: 'ace-view', 
    template: 
`<ace-view *ngFor="let SubView of SubViews" [view]="SubView"></ace-view>`, 
    directives:[ 
     AceViewComponent 
    ] 
}) 
export class AceViewComponent { 
... 
} 

Die Komponente oben setzt sich für Unter Ansichten gezeigt, die wie erwartet funktioniert.

Allerdings habe ich eine Situation, in der die Komponente A Komponente B benötigt und die Komponente B benötigt eine Komponente:

@Component({ 
    selector: 'ace-A', 
    template: 
`<ace-B *ngIf="whatever"></ace-B>`, 
    directives:[ 
     AceB 
    ] 
}) 
export class AceA {} 


@Component({ 
    selector: 'ace-B', 
    template: 
`<ace-A *ngIf="whatever"></ace-A>`, 
    directives:[ 
     AceA 
    ] 
}) 
export class AceB {} 

Dann ist das Problem, dass ACEB ist noch nicht definiert, wenn in den Richtlinien von ACEA verwendet. Schlimmer noch, AceA und AceB könnten sich in verschiedenen Dateien befinden.

  • Was ist die richtige Lösung für diese Art von Wiederholungen?
  • Kann ich dem Direktivitätsarray später zur Laufzeit eine Direktive hinzufügen?
  • Wo finde ich den Quellcode des @component Dekorators und seine Implementierung (damit ich sehen kann, was es tut und versuche, es zur Laufzeit nachzuahmen)?

Antwort

2

Sie würden forwardRef für diesen Anwendungsfall nutzen. In der Tat unterstützen ES6-Klassen das Heben nicht.

@Component({ 
    selector: 'ace-A', 
    template: ` 
    <ace-B *ngIf="whatever"></ace-B> 
    `, 
    directives:[ 
    forwardRef(() => AceB) 
    ] 
}) 
export class AceA {} 

(...) 
+1

Wow, das war schnell! Und es funktioniert, ich werde Ihre Antwort in 5 Minuten akzeptieren. – Alfi

+0

Könnten Sie noch etwas zum Hinzufügen zusätzlicher Anweisungen zur Laufzeit sagen? – Alfi

+0

Gern geschehen! Ich denke, dass es das gleiche ist, da das Problem darin besteht, auf einen Typ zu verweisen, der noch nicht erstellt wurde ;-) –

Verwandte Themen