2017-01-30 1 views
3

В моем приложении Angular у меня есть родительский модуль, который динамически заполняет другие дочерние модули. Мой ребенок модули имеют этот шаблон:angular2: Как использовать EventEmitter для компонентов, созданных во время выполнения?

<input type="radio" class="form-control" 
[checked] = "message.default == 1" 
[value] = "message.default" 
(change)="onSelectionChange(message)" 
name="default" > 

и это тс:

export class MessageComponent implements OnInit { 
    message: MessageInterface; 
    @Output() onCheckedChange = new EventEmitter<MessageInterface>(); 

    constructor() { } 

    ngOnInit() { 
    } 

    onSelectionChange(message: MessageInterface) { 
     this.onCheckedChange.emit(message); 
    } 
} 

и это мой родительский шаблон

<div #placeholder ></div> 

и ц

export class ParentComponent implements OnInit { 
    @ViewChild('placeholder', {read: ViewContainerRef}) placeHolder; 

    ngOnInit() { 
     for(let i=0; i<this.aVariable; i++) { 
      let factory = this.componentFactoryResolver.resolveComponentFactory(ChildComponent); 
      this.placeHolder.createComponent(factory); 
     } 
    } 

    onCheckedChange(message: MessageInterface) { 
     console.log("parent intercept"); 
    } 

, где переменная «aVariable» - это значение, возвращаемое службой, которую я вызываю.

Когда я нажимаю на радиокамеру, не отображается сообщение в журнале, кажется, что родительский источник не получает излучение EventEmitter. Что случилось?

+0

пожалуйста, вставьте селектор в родительском зрения – Sravan

+0

вы должны иметь что-то подобное, '<ребенок (onCheckedChange) =«onCheckedChange ($ событие)»>' – Sravan

+0

Чайлдс не зашиты в родителей, они добавлено во время выполнения с let factory = this.componentFactoryResolver.resolveComponentFactory (ChildComponent); this.placeHolder.createComponent (завод); где placeHoder - @ViewChild ('placeholder', {read: ViewContainerRef}) placeHolder; – giozh

ответ

4

Вам все равно нужно подписаться на эти события, даже если вы создадите этот компонент (ы) во время выполнения!

let comp = this.placeHolder.createComponent(factory) as ComponentRef<ChildComponent>; 
// just to be sure, check some things.. :) 
if (!comp || !comp.instance || !comp.instance.onCheckedChange) continue; 
comp.instance.onCheckedChange.subscribe(msg => this.onCheckedChange(msg)); 
+1

Я думаю, что это должно быть 'comp.instance.onCheckedCahange ...' –

+1

Правильно, даже отливка была неправильной. Спасибо за указание .. :) – mxii

+0

Большое вам спасибо, это работает – giozh

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