Открыть диалоговое окно не работает, Материал Angular 6

Мой .open() в моем диалоговом окне материалов не работает в Angular 6. Я получаю сообщение об ошибке:

ERROR TypeError: Cannot read property 'open' of undefined

Что может пойти не так? Кажется, что импорт MatDialog не распознается

Родительский компонент:

import { Component, OnInit, Input, Inject } from '@angular/core';
import { AuthService } from "../../services/auth.service";
import { SiteService } from "../../services/site.service";
import { MonitoringPointService } from "../../services/monitoring-point.service";
import { Router, ActivatedRoute } from '@angular/router';
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
import { DialogComponent } from '../dialog/dialog.component';

@Component({
  selector: 'app-site-settings',
  templateUrl: './site-settings.component.html',
  styleUrls: ['./site-settings.component.css']})

  export class SiteSettingsComponent implements OnInit {

  constructor(public dialog: MatDialog, private router: Router, private route: ActivatedRoute, public authService: AuthService, public siteService: SiteService,public monitoringPointService: MonitoringPointService ) { }

  openDialog(): void {
    const dialogRef = this.dialog.open(DialogComponent, {
      width: '250px',
    });
  dialogRef.afterClosed().subscribe(result => {
     console.info('The dialog was closed');
    });
  }
  ngOnInit() {
   ...
  }
}

Диалоговый компонент:

import { Component, OnInit, Inject } from '@angular/core';
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';
import { SiteSettingsComponent } from '../site-settings/site-settings.component';


@Component({
  selector: 'app-dialog',
  templateUrl: './dialog.component.html',
  styleUrls: ['./dialog.component.css']
})

export class DialogComponent implements OnInit {

  constructor(  public dialogRef: MatDialogRef<DialogComponent>) { }

  ngOnInit() {}

  onNoClick(): void {
    this.dialogRef.close();
  }

}

Вы импортировали матдиалог глобально и добавили его как входной компонент?

jcuypers 11.03.2019 23:20

Вероятно, нет, означает ли это перечисление его в разделе Bootstrap в app.module? Я получаю сообщение об ошибке, что это невозможно сделать

LaurenAH 11.03.2019 23:26

Я просто просматривал другую тему с аналогичным требованием. Я повторно использую код. stackblitz.com/edit/angular-material-dialog-so55110692

jcuypers 11.03.2019 23:27

@LaurenAH Если проблема все еще существует, попросите вас поделиться стеком.

Prashant Pimpale 12.03.2019 06:20

@jcuypers Большое спасибо - я воспроизвел эту среду (а также добавил матовый диалог css в свой индексный файл), и это сработало.

LaurenAH 12.03.2019 18:30

@LaurenAH, мой ответ помог тебе?

Peter Haddad 12.03.2019 19:05

Извините, но вы разместили то же, что и я, после меня. ладно, это более интересно :-p Я думаю, что у меня мог бы быть принятый ответ на этот вопрос. все равно поделимся. Я в хорошем настроении.

jcuypers 12.03.2019 19:09
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
7
4 323
3

Ответы 3

Вам нужно добавить MatDialogModule в массив импорта в вашем module.ts и CourseDialogComponent в компонент ввода и массив объявлений, например:

import {MatDialogModule} from "@angular/material";
@NgModule({
declarations: [
 ...
 CourseDialogComponent
],
imports: [
 ...
 MatDialogModule
],
providers: [
 ...
],
bootstrap: [AppComponent],
entryComponents: [CourseDialogComponent]
})

export class AppModule {
}

Вы импортировали матдиалог глобально и добавили его как входной компонент?

Нам нужно импортировать компонент Dialog в 2 места модуля App.

  1. декларации
  2. входКомпоненты

После этого не нужно указывать селектор в компоненте диалога, см. пример ниже.

import { Component, Inject } from '@angular/core';
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';

@Component({
    templateUrl: 'dialog.template.html',
})
export class DialogComponent {

  constructor(
    public dialogRef: MatDialogRef<DialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: any) {}

  onNoClick(): void {
    this.dialogRef.close();
  }
}

Другие вопросы по теме