2016-09-02 5 views
6

В настоящее время я загружаю некоторые мои компоненты динамически с помощью этой части кода.Угловой 2: динамически загружать компонент с параметрами @Input и @Output

export class ComponentOutlet { 

    constructor(
     private vcRef: ViewContainerRef, 
     private compiler: Compiler, 
     private dataService: DataService 
    ) { } 

    private _createDynamicComponent() { 

     // Some logic to decide which component should be loaded 
     return MyComponent; 
    } 


    ngOnChanges() { 

     this.compiler.compileComponentAsync(this._createDynamicComponent()) 
      .then(factory => { 
       const injector = ReflectiveInjector.fromResolvedProviders([], this.vcRef.parentInjector); 
       this.vcRef.clear(); 
       this.vcRef.createComponent(factory, 0, injector); 
      }); 
    } 

Проблема заключается в том, что MyComponent имеет некоторые @Input и Output привязок. Можно ли здесь установить эти привязки? Как я могу это достичь?

+0

С RC6 + есть теперь '.compileComponentAsync' .. проверить один вариант здесь http://stackoverflow.com/q/38888008/1679310 * (также с вводом привязок) * –

+0

@ RadimKöhler 'compileComponentAsync' был удален в RC6. С RC6 + теперь 'compileModuleAndAllComponentsAsync' – yurzui

+0

@yurzui, правильно .. вот что я говорю –

ответ

7

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

В вашем случае вы можете сделать это императивно как

var cmpRef = this.vcRef.createComponent(factory, 0, injector); 
cmpRef.instance.someInput = value; 
cmpRef.instance.someOutput.subscribe(data => this.data = data); 
+1

Выполняет ли ngOnChanges() экземпляр с помощью углового при добавлении ввода? Для меня это не так. Мне нужно вызвать cmpRef.instance.ngOnChanges() вручную. –

+2

Нет, 'ngOnChanges()' вызывается, когда 'someProp' изменяется с' [someInput] = "someProp" '. Без такой привязки 'ngOnChanges' не будет вызываться. Вы можете сделать 'someInput' сеттер и поставить там код. –

+0

@ GünterZöchbauer В этом случае мы знаем входы динамически созданного компонента и даем входные данные в качестве компонентов. Итак, что, если мы создаем разные динамические компоненты в соответствии с параметром, и каждый динамический компонент нуждается в разных входах? Должен быть систематический способ передачи входных параметров от родителя к дочернему. – omeralper

Смежные вопросы