是否可以更改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));
}
答案 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