【问题标题】:Angular Custom Elements & Angular 8 Material: MatDialog and MatMenu not workingAngular 自定义元素和 Angular 8 材质:MatDialog 和 MatMenu 不起作用
【发布时间】:2020-01-16 04:24:25
【问题描述】:

我正在使用有角度的自定义元素来构建一个应用程序,其中 MatDialog 是自定义元素的一部分。我在主机应用程序中也有一个 MatMenu。问题是,当我在页面加载时打开 mat-dialog,然后打开 mat-menu,mat-dialog 之后就不起作用了,否则如果我先打开菜单,然后再打开 mat-dialog,则菜单不起作用工作了。

您可以在以下位置找到堆栈闪电战:https://stackblitz.com/edit/angular-nr58ab-tbu38h

我在 index.html 本身中添加了 MatDialog 应用程序的 main.js 代码。 main.js 是在 prod 模式下使用 ngx-build-plus 构建应用程序后生成的,其中 output-hashing none 和 single-bundle true。

MatDialog 应用代码如下:

app.module.ts

import { BrowserModule } from "@angular/platform-browser";
import { BrowserAnimationsModule } from "@angular/platform-browser/animations";

import { NgModule, Injector } from "@angular/core";

import { AppRoutingModule } from "./app-routing.module";
import { AppComponent } from "./app.component";
import { createCustomElement } from "@angular/elements";

import { MatDialogModule, MatButtonModule } from "@angular/material";


@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    AppRoutingModule,
    MatDialogModule,
    BrowserAnimationsModule,
    MatButtonModule
  ],
  providers: [],
  bootstrap: [AppComponent],
  entryComponents: [AppComponent]
})
export class AppModule {
  constructor(private injector: Injector) {
    const myCustomElement = createCustomElement(AppComponent, {
      injector: this.injector
    });
    customElements.define("app-test-data", myCustomElement);
  }
  ngDoBootstrap() {}
}

app.component.ts

import { Component, Input, TemplateRef } from "@angular/core";
import { MatDialog } from "@angular/material";

@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  constructor(private dialog: MatDialog) {}
  openModal(temp: TemplateRef<any>) {
    this.dialog.open(temp, { width: "100px", height: "100px" });
  }
}

和 app.component.html

<button mat-raised-button (click)="openModal(modal)">Open</button>

<ng-template #modal>
  <mat-dialog-content>
    Hello
  </mat-dialog-content>
</ng-template>

这是我在 stackblitz 中构建并放入应用程序的 index.html 中的应用程序。

我已经坚持了一段时间,我也尝试在 NgZone.run() 中运行 dialog.open(),但也没有运气。谢谢。

【问题讨论】:

  • 您创建自定义元素而不是组件是否有任何具体原因?
  • 是的,对话框组件显示了一些数据,我在自定义元素本身中获取这些数据。我只能使用自定义元素,因为我们也正在考虑将其用作独立应用程序。
  • Modal 实例关闭时的东西没有破坏,你能检查一次吗?
  • 我已经检查过了,如果我不打开菜单,模式可以正常工作。这取决于我先打开什么,如果我先打开模态然后再打开菜单,那么模态将不再打开,反之亦然。在检查元素时,我注意到 cdk-overlay-container div 停止变化。
  • @Tarang 我们将应用程序升级到 Angular 9 和 10,现在这个问题已经解决了。

标签: angular angular-material custom-element micro-frontend angular-ngzone


【解决方案1】:

如果您使用的是 Angular 8 及以下版本。考虑升级到 Angular 10。

基于角度元素的微前端,我们也面临同样的问题。将应用程序升级到 Angular 10,问题就神奇地解决了。 :)

【讨论】:

    【解决方案2】:

    更改自定义元素的名称

    customElements.define("app-custom-component", myCustomElement);
    

    Working Demo

    在这个演示中运行良好。

    如果您仍然遇到问题,请告诉我。

    【讨论】:

    • 谢谢,但将菜单和对话框保留在同一个应用程序中工作正常,但我的要求是将它们保留在两个单独的应用程序中,然后将对话框作为微前端包含在主机应用程序中(菜单在这里)。即使更改了自定义元素名称,这仍然不起作用。
    • 您能否根据您的要求更新我的演示中的代码。那我可以看看。
    • 我分享的演示中有 MatMenu 的代码。 MatDialog 应用程序是使用 ngx-build-plus 构建的,因此生成了 main.js,我已将 index.html 放入脚本标签中。源代码就是我在我的问题中给出的。
    猜你喜欢
    • 2019-10-18
    • 2019-07-06
    • 2019-06-11
    • 1970-01-01
    • 2020-04-05
    • 2021-11-05
    • 1970-01-01
    • 2018-01-02
    • 2018-02-07
    相关资源
    最近更新 更多