EventEmitter от загрузочного модального компонента к родительскому
Я использую ng-bootstrap с Angular 4, конкретный вариант использования - модальный с "Компонент как контент" (второй сценарий из https://ng-bootstrap.github.io/#/components/modal/examples).
Я хотел бы исправить некоторые данные от ребенка до родителя. Для этого я создал нерабочий plunk из примера:
modal.component.ts
import {Component, Input, Output, EventEmitter} from '@angular/core';
import {NgbModal, NgbActiveModal} from '@ng-bootstrap/ng-bootstrap';
@Component({
selector: 'ngbd-modal-content',
template: '
<div class="modal-header">
<h4 class="modal-title">Hi there!</h4>
</div>
<div class="modal-body">
<p>Hello!</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" (click)="testclick('teststring')">Testclick</button>
</div>
'
})
export class NgbdModalContent {
@Output() clickevent = new EventEmitter<string>();
constructor(public activeModal: NgbActiveModal) {}
testclick(teststring: string) {
this.clickevent.emit(teststring);
}
}
@Component({
selector: 'ngbd-modal-component',
templateUrl: 'src/modal-component.html'
})
export class NgbdModalComponent {
constructor(private modalService: NgbModal) {}
open() {
const modalRef = this.modalService.open(NgbdModalContent);
}
}
modal.component.html
<button class="btn btn-lg btn-outline-primary" (click)="open()">Launch demo modal</button>
Как вы можете видеть, я только добавил EventEmitter в компонент NgbdModalContent. Я бы хотел, чтобы NgbdModalComponent получил событие testclick
и зарегистрировал его на консоли. Где я могу поместить его в код выше?
Я знаю, что здесь очень похожий вопрос: эмитент событий от bootstrap modal до parent, но я думаю, что это все еще очень другой сценарий реализации, так как я открываю модально непосредственно как компонент здесь.
Очевидно, я предпочел бы некоторые простые решения, в которых мне не нужно входить в код для самого modalService
...
Ответы
Ответ 1
Это на самом деле очень просто, поскольку вы можете напрямую подписаться на события @Output
компонента, открытого как модальный контент:
export class NgbdModalComponent {
constructor(private modalService: NgbModal) {}
open() {
const modalRef = this.modalService.open(NgbdModalContent);
modalRef.componentInstance.name = 'World';
modalRef.componentInstance.clickevent.subscribe(($e) => {
console.log($e);
})
}
}
Вот рабочий плункер: http://plnkr.co/edit/rMJ7qfSSLK0oHspIJbDB?p=preview
Боковое замечание: я не уверен, каков ваш конкретный вариант использования, но ответ на событие с эмиттером Event от bootstrap modal до parent показывает предпочтительный способ связи между модальным носителем и компонентом, используемым в качестве модального контента.