Reputation: 21
I'd like to open a simple modal dialog inspired by the examples provided at https://material.angular.io/components/dialog/overview
I have a big angular-material-module.ts where I manage all the material imports:
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { OverlayModule } from '@angular/cdk/overlay';
import { CdkTreeModule } from '@angular/cdk/tree';
import { PortalModule } from '@angular/cdk/portal';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatButtonModule } from '@angular/material/button';
import { MatButtonToggleModule } from '@angular/material/button-toggle';
import { MatCardModule } from '@angular/material/card';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatChipsModule } from '@angular/material/chips';
import { MatRippleModule } from '@angular/material/core';
import { MatDividerModule } from '@angular/material/divider';
import { MatExpansionModule } from '@angular/material/expansion';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatListModule } from '@angular/material/list';
import { MatMenuModule } from '@angular/material/menu';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatSelectModule } from '@angular/material/select';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatSortModule } from '@angular/material/sort';
import { MatTableModule } from '@angular/material/table';
import { MatTabsModule } from '@angular/material/tabs';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatTreeModule } from '@angular/material/tree';
import { MatBadgeModule } from '@angular/material/badge';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatRadioModule } from '@angular/material/radio';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MatSliderModule } from '@angular/material/slider';
import { MatDialogModule } from '@angular/material/dialog'; // <====
const materialModules = [
CdkTreeModule,
MatAutocompleteModule,
MatButtonModule,
MatCardModule,
MatCheckboxModule,
MatChipsModule,
MatDividerModule,
MatExpansionModule,
MatIconModule,
MatInputModule,
MatListModule,
MatMenuModule,
MatProgressSpinnerModule,
MatPaginatorModule,
MatRippleModule,
MatSelectModule,
MatSidenavModule,
MatSnackBarModule,
MatSortModule,
MatTableModule,
MatTabsModule,
MatToolbarModule,
MatFormFieldModule,
MatButtonToggleModule,
MatTreeModule,
OverlayModule,
PortalModule,
MatBadgeModule,
MatGridListModule,
MatRadioModule,
MatDatepickerModule,
MatTooltipModule,
MatSliderModule,
MatDialogModule, // <===========
];
@NgModule({
imports: [
CommonModule,
...materialModules // <==========
],
exports: [
...materialModules // <==========
],
})
export class AngularMaterialModule { }
and my app.module.ts looks like this :
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { AngularMaterialModule } from './angular-material.module'; // <============
import { LoginComponent } from './login/login.component';
import { DashboardComponent } from './dashboard/dashboard.component';
import { FormsModule } from '@angular/forms';
@NgModule({
declarations: [
AppComponent,
LoginComponent,
DashboardComponent,
],
imports: [
BrowserModule,
AppRoutingModule,
BrowserAnimationsModule,
AngularMaterialModule, // <========
FormsModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
My dashboard component code loke like this :
import { Component, ViewChild, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import {MatSnackBar } from '@angular/material/snack-bar';
import {MatDialog} from '@angular/material/dialog'; // <==========
import {MatMenuTrigger} from '@angular/material/menu';
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.css']
})
export class DashboardComponent implements OnInit {
@ViewChild('menuTrigger') menuTrigger!: MatMenuTrigger;
constructor(private router: Router, private snackBar: MatSnackBar, public dialog: MatDialog) { }
ngOnInit(): void {
this.snackBar.open("Test", "Close");
}
onInfo(): void {
const dialogRef = this.dialog.open(UserInfoDialog, {restoreFocus: false});
// Manually restore focus to the menu trigger since the element that
// opens the dialog won't be in the DOM any more when the dialog closes.
dialogRef.afterClosed().subscribe(() => this.menuTrigger.focus());
}
onLogout(): void {
this.router.navigateByUrl("/login");
}
}
@Component({
selector: 'user-info-dialog',
templateUrl: 'user-info-dialog.html',
})
export class UserInfoDialog {}
And user-info-dialog.html looks like this :
<mat-dialog-content>
This is a dialog
</mat-dialog-content>
<mat-dialog-actions>
<button mat-button mat-dialog-close>Okay</button>
</mat-dialog-actions>
After saving files, the Visual Code Debugger says for file user-info-dialog.html :
(element) mat-dialog-content: HTMLElement 'mat-dialog-content' is not a known element:
Solution 1 seems already ok (app.module.ts imports), I tried solution 2 without success...
What am I missing ?
Thank you.
Note : ng --version output :
ng --version
_ _ ____ _ ___
/ \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|
/ △ \ | '_ \ / _` | | | | |/ _` | '__| | | | | | |
/ ___ \| | | | (_| | |_| | | (_| | | | |___| |___ | |
/_/ \_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___|
|___/
Angular CLI: 13.3.3
Node: 16.14.2
Package Manager: npm 8.5.0
OS: linux x64
Angular: 13.3.3
... animations, cdk, cli, common, compiler, compiler-cli, core
... forms, material, platform-browser, platform-browser-dynamic
... router
Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1303.3
@angular-devkit/build-angular 13.3.3
@angular-devkit/core 13.3.3
@angular-devkit/schematics 13.3.3
@schematics/angular 13.3.3
rxjs 7.5.5
typescript 4.6.3
Upvotes: 0
Views: 3858
Reputation: 21
Found the problem!
I had to add UserInfoDialog
to @NgModule.declarations
Upvotes: 2