Angular自定义元素和Angular 8材质:MatDialog和MatMenu不起作用

时间:2020-01-16 04:24:25

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

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

您可以在https://stackblitz.com/edit/angular-nr58ab-tbu38h

中找到堆叠闪电战

我已经在index.html本身中添加了MatDialog应用程序的main.js代码。 main.js是在生产模式下使用ngx-build-plus构建应用程序后生成的,其中没有输出哈希且单束为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>

这是我构建的应用程序,并放入堆栈闪电战中该应用程序的index.html中。

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

2 个答案:

答案 0 :(得分:0)

如果您使用的是Angular 8及更低版本。考虑升级到角度10。

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

答案 1 :(得分:-1)

更改自定义元素的名称

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

Working Demo

在此演示中运行正常。

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