MatDialog 未在自定义 OverlayContainer 内以 15 角呈现

问题描述 投票:0回答:2

在 Angular 15 中,如果一个组件提供了 OverlayContainer 并被覆盖以将其用作自定义容器元素,则单个覆盖元素不会在容器内呈现(),而是附加到文档主体(默认行为)。

@Injectable()
export class OverlayService extends OverlayContainer{
    constructor(
      @Inject(DOCUMENT) _document: any,
      platform: Platform,
      private problem: ElementRef<HTMLElement>
    ) {
      super(_document, platform);
    }

    protected override _createContainer(): void {
      const containerClass = "cdk-overlay-container";
      const container = this._document.createElement("div");
      container.classList.add(containerClass);

      this.problem.nativeElement.appendChild(container);
      this._containerElement = container;
    }

}
@Component({
  selector: 'app-problem',
  templateUrl: './problem.component.html',
  styleUrls: ['./problem.component.css'],
  providers: [
    DialogServiceService,
    MatDialog,
    { provide: OverlayContainer, useClass: OverlayService },
  ],
})

当前行为:

<body>
  <app-problem></app-problem>
</body>
<div class="cdk-overlay-container">
  <mat-dialog-container></mat-dialog-container>
</div>

https://stackblitz.com/edit/angular-pfwikb?file=src%2Fapp%2Fproblem%2Fproblem.component.ts

我期待 MatDialog 像以前的角度版本一样在自定义容器内呈现。

预期行为:

<body>
 <app-problem>
   <div>....</div>
   <div class="cdk-overlay-container">
      <mat-dialog-container></mat-dialog-container>
   </div>
 </app-problem>
</body>
angular angular-material overlay mat-dialog
2个回答
1
投票

我还没有将任何应用程序迁移到 v15(并且可能不会很快),所以我无法为您提供完整的工作解决方案 - 但也许我至少能够将您推向正确的方向。

如果您看一下 MatDialogBase构造函数,您会注意到虽然

OverlayContainer
仍然被注入,但它被记录为已弃用且不再使用。这就是为什么您的
MatDialog
仍以默认
cdk-overlay-container
呈现的原因。

MatDialog
文档没有提及任何关于更改呈现对话框的容器的内容。如果您深入研究源代码,您会发现它将在
MatDialogContainer
中呈现 - 但似乎这是不可配置的,因为它是在
MatDialog
中明确输入的,并且没有在
MatDialogConfig
中公开。因此,除非我遗漏了什么(我很可能遗漏了什么),否则您不能再更换容器了。我认为你最好的选择是在
angular/components
repo 的 github 中创建一个问题 - 如果有办法,我相信你会通过一个例子得到他们的回应,特别是因为它看起来像是一个巨大的回归。

幸运的是,自 v14 以来,有一个

MatDialog
的替代方案 - 即
CdkDialog
它的构建基础。在那里, DialogConfig 公开了一个
container
属性,它允许您为将在其中呈现对话框的组件指定组件类型或工厂。缺点是你会失去材质样式,必须应用自己的样式。


0
投票

经过 4 天的寻找解决方案后,这个技巧很有魅力

in your CSS file add this style : 


    .mat-mdc-dialog-container {
   position: fixed !important;
   top:0  !important;
   bottom: 0  !important;
   left: 0  !important;
   right: 0 !important;
   display: flex !important;
   width: 50% !important;
   height: 50% !important;
   margin: auto  !important;
}
© www.soinside.com 2019 - 2024. All rights reserved.