2016-01-06 2 views
11

Документы DynamicContentLoader не объясняют, как я могу правильно загружать входные данные дочернего компонента. Скажем, у меня есть ребенок, как:Как передать параметры @Input() в угловой компонент 2, созданный с помощью DynamicComponentLoader

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

и родителей, как:

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

Как я должен идти о прохождении thing в компонент ребенка таким образом, что два компонента могут быть данные, связанные с тем же вещь.

Я пытался сделать это:

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

Это вроде работает, но они не синхронизированы, как можно было бы ожидать.

В основном я пытаюсь достичь того же, что было бы достигнуто с помощью ng-include в угловом 1, где ребенок является динамически определенным компонентом и разделяет модель с ее родителем.

Заранее спасибо ...

+2

Вы можете использовать EventEmitter для этого случая, проверить это [plnkr] (http://plnkr.co/edit/SHc0yeUOSqn0pITXztHa?p=preview) –

+0

Это интересная идея и заставляет задуматься. Я не уверен, что это вполне подходит для моего сценария. То, что я действительно пытаюсь сделать, состоит из двух компонентов, которые представляют две половины формы, которая редактирует одну модель. Спасибо, хотя, я думаю, он по-прежнему пригодится. –

ответ

5

Я сделал несколько тестов для вашей проблемы, и я не могу воспроизвести его.

Вот содержание моего ребенка компонента:

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

    constructor() { 
    } 
} 

Вот содержание родительского компонента:

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

Поэтому у меня есть два входа, связанные в том же элементе: один внутри родительский компонент и один в дочернем. Когда я обновляю значение на одном входе, другое значение обновляется на другом входе.

Таким образом, оба компонента имеют один и тот же экземпляр и могут его обновлять. Возможно, я пропустил что-то в вашем прецеденте, поэтому не стесняйтесь говорить мне!

Надеется, что это помогает вам, Тьерри

+2

Это решение работает хорошо, если 'thing' является объектом или массивом, потому что родительский и дочерний объекты получают ссылку на один и тот же объект. Однако, если 'thing' является примитивным типом (String, number, boolean), он не работает - родительский и дочерний каждый получает свой собственный примитив. [Plunker] (http://plnkr.co/edit/MuvEyCLOzNX3J28ZI3UY?p=preview). Решение Эрика с EventEmitter представляется более универсальным решением (оно работает со ссылочными типами и примитивными типами). –

+0

Интересно, что он работает на вас. Надеюсь, это обнадеживает. Возможно, что-то мне не хватает. Мой родительский компонент является частью вложенного маршрута. Также у меня есть вложенные формы, связанные с родительским и дочерним компонентами. Возможно, это мешает. Я должен сказать, что материал ng2-форм довольно запутан, поэтому, возможно, у меня что-то не так. Я попробую немного раздеть его и посмотреть, смогу ли я получить те же результаты, что и вы. –

+0

Да, ты прав, Марк! Извините, я пропустил ваш комментарий ... Если вы хотите также поддерживать примитивные типы, мы должны использовать EventEmitter, как это сделал Эрик. Спасибо за указание на это! –