2016-01-06 32 views
11

I documenti di DynamicContentLoader non spiegano come caricare correttamente gli input di un componente figlio. Diciamo che ho un bambino come:Come passare i parametri @Input() a un componente angolare 2 creato con DynamicComponentLoader

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

e un genitore come:

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

Come devo fare per passare thing nella componente figlio tali dati che i due componenti possono essere vincolati contro lo stesso cosa.

Ho provato a fare questo:

@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; 
    }); 
    } 
} 

E 'sorta di opere, ma non sono sincronizzati come ci si aspetterebbe.

Fondamentalmente sto cercando di ottenere la stessa cosa che sarebbe stata ottenuta utilizzando ng-include in angular 1 dove il bambino è un componente determinato dinamicamente e condivide il modello con il suo genitore.

Grazie in anticipo ...

+2

È possibile utilizzare EventEmitter per questo caso, controllare questo [plnkr] (http://plnkr.co/edit/SHc0yeUOSqn0pITXztHa?p=preview) –

+0

E 'un'idea interessante e mi fa pensare Non sono sicuro che sia del tutto adatto al mio scenario. Quello che sto cercando di fare è avere due componenti che rappresentano entrambe due metà di un modulo che sta modificando un singolo modello. Grazie però, penso che tornerà utile. –

risposta

5

ho fatto alcuni test per il vostro problema e non riesco a riprodurla.

Ecco il contenuto della mia componente figlio:

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

    constructor() { 
    } 
} 

Ecco il contenuto del componente principale:

@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; 
    }); 
    } 
} 

Così ho due ingressi legati sullo stesso elemento: uno all'interno della componente genitore e uno in quello figlio. Quando aggiorno il valore in un input, l'altro valore viene aggiornato nell'altro input.

Quindi entrambi i componenti condividono la stessa istanza e possono aggiornarlo. Forse mi sono perso qualcosa nel tuo caso d'uso, quindi sentiti libero di dirmelo!

Spero che ti aiuta, Thierry

+2

Questa soluzione funziona bene se 'thing' è un oggetto o un array, perché sia ​​il genitore che il bambino ottengono un riferimento allo stesso oggetto. Tuttavia, se 'thing' è un tipo primitivo (String, number, boolean), non funziona - genitore e figlio ottengono ciascuno la propria primitiva. [Plunker] (http://plnkr.co/edit/MuvEyCLOzNX3J28ZI3UY?p=preview). La soluzione di Eric con EventEmitter sembra essere una soluzione più universale (funziona con tipi di riferimento e tipi primitivi). –

+0

Interessante che funzioni per te. Questo è incoraggiante, credo. Forse c'è qualcosa che mi manca. Il mio componente genitore fa parte di una rotta nidificata. Inoltre ho moduli nidificati coinvolti nei componenti padre e figlio. Forse questo sta interferendo con le cose. Devo dire che la roba delle form ng2 è abbastanza confusa quindi forse ho qualcosa che non va. Proverò a smontare un po 'e vedere se riesco a ottenere gli stessi risultati di te. –

+0

Sì, hai ragione, Mark! Scusa se ho perso il tuo commento ... Se vuoi supportare anche i tipi primitivi, dovremmo sfruttare EventEmitter come Eric. Grazie per aver segnalato questo! –

Problemi correlati