Angular CDK叠加层,更改默认叠加层容器

时间:2019-03-21 20:10:49

标签: javascript angular angular-material cdk

是否可以更改OverlayContainer?

我已经创建了一个工具提示组件,但是有时我想将覆盖图附加到特定元素(默认情况下,覆盖图附加到文档主体)。

这是我创建叠加层的方式:

  private initOverlay(): void {
    const positionStrategy = this.overlayPositionBuilder
      .flexibleConnectedTo(this.elementRef)
      .withPositions([this.resolvedConfig]);

    this.overlayRef = this.overlay.create({positionStrategy});
  }

这就是我将模板附加到它的方式:

  show(): void {
    this.overlayRef.attach(new TemplatePortal(this.tpl, this.viewContainerRef));
  }

1 个答案:

答案 0 :(得分:1)

请参考此stackblitz示例。

  

看起来您可以通过扩展   通过OverlayContainer

中的以下内容app.module.ts

{ provide: OverlayContainer, useFactory: () => new AppOverlayContainer() }

Stackblitz

https://stackblitz.com/edit/angular-material2-issue-ansnt5?file=app%2Fapp.module.ts


此GitHub注释还提供了如何将其打包在directive

中的示例

GitHub评论

https://github.com/angular/material2/issues/7349#issuecomment-337513040


19/3/22修订版工作指令示例

通过OverlayContainer扩展cdk-overlay-container.ts

将类放在app.module.ts

  providers: [
    { provide: OverlayContainer, useClass: CdkOverlayContainer },
  ]

在您的cdk-overlay-container.ts中,您无法使用默认的_createContainer(),并提供了自己的自定义公用方法myCreateContainer来替换它。

  

您实际上是在这里创建一个空的div,向其添加一个自定义类my-custom-overlay-container-class并将其附加到   div指令已附加到该容器,然后将该容器传递给   真_containerElement中的私有变量OverlayContainer   课。

/**
* Create overlay container and append to ElementRef from directive
*/ 
public myCreateContainer(element: HTMLElement): void {
   let container = document.createElement('div');
   container.classList.add('my-custom-overlay-container-class');

   element.appendChild(container);
   this._containerElement = container;
 }
 /**
  * Prevent creation of the HTML element, use custom method above
  */
 protected _createContainer(): void {
     return;
 }

然后在您的cdk-overlay-container.directive.ts中,您正在呼叫myCreateContainer()并将ElementRef作为参数传递。

 this.cdkOverlayContainer['myCreateContainer'](this.elementReference.nativeElement);

然后在HTML中将指令分配到您希望其显示的位置。

<div myCdkOverlayContainer 

Stackblitz

https://stackblitz.com/edit/angular-material2-issue-6nzwws?embed=1&file=app/app.component.html