传递参数构造动态组件 angular 【overlay angular cdk】【注入器 Injector injectiontoken】

需求:

点击组件dashboard的按钮openProtocolMenu(),打开名为child的overlay组件。

同时我们想从dashboard组件传递变量给child组件,来动态显示 overlay 的C组件。

点击child组件上的onClose按钮,可以调用dashboard组件的方法detach()来关闭overlay。

下面这个是dashboard.ts:

// 动态变化的参数:dataToPass
  // createInjector(dataToPass: any): PortalInjector {
  //   const injectionTokens = new WeakMap().set(SvgToken, dataToPass);
  //   return new PortalInjector(this.injector, injectionTokens);
  // }

  openProtocolMenu() {
    if (this.useOverLay) {
      const positionStrategy = this.overlay
        .position()
        // .flexibleConnectedTo(this.el);
        .global()
        .left(`${this.leftPixelsToWindow}px`)
        .bottom(`${this.bottomPixelsToWindow}px`);
      const overlayRef = this.overlay.create({
        // 创建 overlay
        positionStrategy,
        hasBackdrop: true
        // backdropClass: 'overlay-class'
      });
      const injectionTokens = new WeakMap().set(SvgToken, ''); // 传递参数
      const userProfilePortal = new ComponentPortal( // 创建 ComponentPortal
        ProtocolMenuComponent,
        null,
        // this.createInjector('assets/icon/downAdd.svg')
        new PortalInjector(this.injector, injectionTokens)
      );
      // console.log('test ', c.instance.pictureSource); // 可以获取到值
      const c = overlayRef.attach(userProfilePortal); // 把 ComponentPortal 添加到 overlay 上
 overlayRef.backdropClick().subscribe(
        () => overlayRef.detach(),
        e => console.error(e)
      );
 c.instance.close.asObservable().subscribe(
        () => overlayRef.detach(),
        e => console.error(e)
      );   // 这个close方法在child组件里
}
// subscribe 了记得取消订阅

下面这个是child组件:

@Output() close = new EventEmitter<void>(); 
 onClose() {
    this.close.emit();
  }

//这样就能在dashboard的c实例里获取到这个方法了。

 需求:

多个组件复用同一个overlay的child组件


马克:https://www.cnblogs.com/worktile/p/10559311.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值