我正在尝试实现一个基本的(非常基本的)模式实现。我有一个ModalService
和一个ModalComponent
。
ModalService
创建一个实例并使用@angular/cdk/portal 将其ModalComponent
注入到页面中。
我可以让模态显示得很好:-)
ModalComponent
有一个我希望订阅的 Observable 属性,以便ModalService
在模式中单击“关闭”按钮时,可以发出一个值并且ModalService
可以关闭模式。
但是,当组件发出值时,服务不会对其进行操作。从服务端看,我好像订阅了,但从组件端看,它显示了 0 个观察者。
我想也许我可以使用一个典型的@Output()
EventEmitter,但我不确定在模态类中将其连接起来,因为子元素最初不存在。
我在想也许我的组件引用不太正确(也许我有 2 个不同的?)。我正在尝试从这个答案中提出建议
任何想法我做错了什么?
服务
export class ModalService {
private modalPortal: ComponentPortal<any>;
private bodyPortalHost: DomPortalHost;
constructor(private componentFactoryResolver: ComponentFactoryResolver,
private appRef: ApplicationRef,
private injector: Injector) {
}
showModal(modalName: string) {
// set up the portal and portal host
this.modalPortal = new ComponentPortal(ModalComponent);
this.bodyPortalHost = new DomPortalHost(
document.body,
this.componentFactoryResolver,
this.appRef,
this.injector);
// display the component in the page
let componentRef = this.bodyPortalHost.attach(this.modalPortal);
// listen for modal's close event
componentRef.instance.onModalClose().subscribe(() => {
console.log('I will be very happy if this this gets called, but it never ever does');
this.closeModal();
});
// console.log(componentRef.instance.onModalClose()) shows 1 subscriber.
}
closeModal() {
this.bodyPortalHost.detach();
}
}
零件
export class ModalComponent {
private modalClose: Subject<any> = new Subject();
onModalClose(): Observable<any> {
return this.modalClose.asObservable();
}
closeModal() {
// console.log(this.onModalClose()) **shows zero observers** :-(
this.modalClose.next();
this.modalClose.complete();
}
}
另外,如果我碰巧问错了问题,这意味着有更好的整体方法,我愿意接受建议。:-)
谢谢!