2016-01-06 8 views
11

Die DynamicContentLoader-Dokumentation erläutert nicht, wie die Eingaben einer untergeordneten Komponente ordnungsgemäß geladen werden können. Lassen Sie uns sagen, dass ich ein Kind haben, wie:So übergeben Sie @Input() - Parameter an eine eckige 2-Komponente, die mit DynamicComponentLoader erstellt wurde

@Component({ 
    selector: 'child-component', 
    template: '<input type="text" [(ngModel)]="thing.Name" />' 
}) 
class ChildComponent { 
    @Input() thing : any; 
} 

und ein Elternteil wie:

@Component({ 
    selector: 'my-app', 
    template: 'Parent (<div #child></div>)' 
}) 
class MyApp { 
    thing : any; 
    constructor(dcl: DynamicComponentLoader, elementRef: ElementRef) { 
    dcl.loadIntoLocation(ChildComponent, elementRef, 'child'); 
    } 
} 

Wie soll ich mich über thing in die untergeordnete Komponente, so dass die beiden Komponenten vorbei gegen die gleiche gebunden Daten sein Ding.

Ich habe versucht, dies zu tun:

@Component({ 
    selector: 'my-app', 
    template: 'Parent (<div #child></div>)' 
}) 
class MyApp { 
    thing : any; 
    constructor(dcl: DynamicComponentLoader, elementRef: ElementRef) { 
    dcl.loadIntoLocation(ChildComponent, elementRef, 'child').then(ref => { 
     ref.instance.thing = this.thing; 
    }); 
    } 
} 

Es Art funktioniert, aber sie sind wie man es erwarten würde, nicht synchronisiert.

Im Grunde versuche ich dasselbe zu erreichen, was mit ng-include in Winkel 1 erreicht worden wäre, wo das Kind eine dynamisch bestimmte Komponente ist und das Modell mit seinem Elternteil teilt.

Vielen Dank im Voraus ...

+2

Sie EventEmitter für diesen Fall nutzen können, lesen Sie in diesem [plnkr] (http://plnkr.co/edit/SHc0yeUOSqn0pITXztHa?p=preview) –

+0

Das ist eine interessante Idee ist und bringt mich zum Grübeln. Ich bin mir nicht sicher, ob es für mein Szenario völlig geeignet ist. Was ich wirklich versuche, ist, zwei Komponenten zu haben, die beide zwei Hälften eines Formulars darstellen, das ein einzelnes Modell bearbeitet. Danke, aber ich denke, es wird immer noch nützlich sein. –

Antwort

5

Ich habe einige Tests für Ihr Problem und ich kann es nicht wiedergeben kann. Hier

ist der Inhalt meines Kindes Komponente:

@Component({ 
    selector: 'child-component', 
    template: ` 
    <div> 
     Child component - <input type="text" [(ngModel)]="thing.name" /> 
    </div> 
    ` 
}) 
export class ChildComponent { 
    @Input() thing : any; 

    constructor() { 
    } 
} 

Hier ist der Inhalt der Stammkomponente:

@Component({ 
    selector: 'my-dyn-parent', 
    template: ` 
    <div> 
     Parent component - <input type="text" [(ngModel)]="thing.name" /> (<br/> 
     <div #child></div> 
     <br/>) 
    </div> 
    ` 
}) 
export class ParentComponent { 
    thing : any; 
    constructor(dcl: DynamicComponentLoader, elementRef: ElementRef) { 
    this.thing = { name: 'test name' }; 
    dcl.loadIntoLocation(ChildComponent, elementRef, 'child') 
        .then((compRef:ComponentRef) => { 
     compRef.instance.thing = this.thing; 
    }); 
    } 
} 

So habe ich zwei Eingänge auf dem gleichen Element gebunden: eine innerhalb der Mutterkomponente und eine in der Kind-Komponente. Wenn ich den Wert in einer Eingabe aktualisiere, wird der andere Wert in der anderen Eingabe aktualisiert.

Also beide Komponenten teilen sich die gleiche Instanz und können sie aktualisieren. Vielleicht habe ich etwas in deinem Anwendungsfall verpasst, also sag es mir ruhig!

Hoffe, es hilft Ihnen, Thierry

+2

Diese Lösung funktioniert gut, wenn "Ding" ein Objekt oder ein Array ist, weil Eltern und Kind beide eine Referenz auf das gleiche Objekt erhalten. Wenn "Sache" jedoch ein primitiver Typ ist (String, Zahl, Boolean), funktioniert es nicht - Eltern und Kinder erhalten jeweils ihr eigenes Primitiv. [Plunker] (http://pnnr.co/edit/MuvEyCLOzNX3J28ZI3UY?p=preview). Erics Lösung mit dem EventEmitter scheint eine universellere Lösung zu sein (sie arbeitet mit Referenztypen und primitiven Typen). –

+0

Interessant, dass es für Sie arbeitet. Das ist ermutigend, denke ich. Vielleicht fehlt mir etwas. Meine Elternkomponente ist Teil einer verschachtelten Route. Ich habe auch verschachtelte Formulare in den Eltern- und Kindkomponenten. Vielleicht stört das die Dinge. Ich muss sagen, dass die ng2-Formulare ziemlich verwirrend sind, möglicherweise habe ich etwas falsch. Ich werde versuchen, es ein bisschen zu strippen und sehen, ob ich die gleichen Ergebnisse wie du bekommen kann. –

+0

Ja, du hast Recht, Mark! Sorry, ich habe deinen Kommentar verpasst ... Wenn du auch primitive Typen unterstützen willst, sollten wir EventEmitter wie Eric nutzen. Danke, dass du das unterstrichen hast! –

Verwandte Themen