Я собираюсь связаться с Angular Elements на Angular 7 для создания легких веб-компонентов, которые можно просто развернуть на существующих веб-страницах.
Первые тесты были многообещающими, однако у меня возникли проблемы с отображением диалогов на основе Angular Material (MatDialog).
Если я создаю компонент Angular (FilterComponent) как элемент Angular и запускаю созданный веб-компонент на простой веб-странице HTML5, диалоговое окно отображается непосредственно на базовой веб-странице, а не в отдельном окне.
Я использую стабильную версию Angular / cli 7.3.8.
app.module.ts:
@NgModule({
declarations: [
AppComponent,
SearchElementComponent,
FilterDialogComponent,
FilterComponent,
],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
MaterialModule,
ReactiveFormsModule,
],
entryComponents: [SearchElementComponent, FilterComponent, FilterDialogComponent]
})
export class AppModule {
constructor(private injector: Injector) {
}
ngDoBootstrap() {
// Convert `SearchElementComponent` to a custom element.
const SearchElementElement = createCustomElement(SearchElementComponent, {injector: this.injector});
// Register the custom element with the browser.
customElements.define('search-element', SearchElementElement);
const FilterComponentElement = createCustomElement(FilterComponent, {injector: this.injector});
customElements.define('filter-element', FilterComponentElement);
}
}
filter.component.ts:
@Component({
selector: 'app-filter',
template: `
<button mat-mini-fab class="filer-button" (click)="openFilterDialog()" title="Filter">
<i class="material-icons filter-icon">filter_list</i>
</button>
`,
styleUrls: ['./filter.component.css'],
encapsulation: ViewEncapsulation.ShadowDom
})
export class FilterComponent {
topicMedical = true;
topicPharma = true;
topicBiotec = true;
constructor(
public dialog: MatDialog,
) { }
public openFilterDialog(): void {
const dialogRef = this.dialog.open(FilterDialogComponent, {
panelClass: 'filterDialog',
autoFocus: false,
minWidth: 350,
maxWidth: '60%',
maxHeight: '45%',
data: {
topicMedical: this.topicMedical,
topicPharma: this.topicPharma,
topicBiotec: this.topicBiotec,
}
});
dialogRef.afterClosed().subscribe(data => {
console.log('Filter dialog closed. ');
});
}
}
фильтр-dialog.component.ts:
@Component({
selector: 'app-filter-dialog',
templateUrl: './filter-dialog.component.html',
styleUrls: ['./filter-dialog.component.css'],
encapsulation: ViewEncapsulation.ShadowDom
})
export class FilterDialogComponent {
constructor(
public dialogRef: MatDialogRef<FilterDialogComponent>,
@Inject(MAT_DIALOG_DATA) public data: FilterDialogData) { }
onNoClick(): void {
this.dialogRef.close();
}
}
У кого-нибудь есть подсказка, почему диалоговое окно не работает должным образом?
Отображается, как и ожидалось, как обычное угловое приложение
Однако: отображается как угловой элемент / веб-компонент на простой веб-странице, а не в отдельном диалоговом окне.
Буду признателен за все ваши комментарии: -)