NullInjectorError:没有MatDialogRef的提供者

rc2*_*c21 24 typescript angular-material angular angular5

我不能像文档中描述的那样注入MatDialogRef:https://material.angular.io/components/dialog/overview

当我试图这样做时,我有错误:

错误错误:StaticInjectorError [MatDialogRef]:StaticInjectorError [MatDialogRef]:NullInjectorError:没有MatDialogRef的提供程序!

app.module.ts

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule }   from '@angular/forms';

import {
	MatInputModule,
	MatDialogModule,
	MatProgressSpinnerModule,
	MatButtonModule,
	MatDialog,
	MatDialogRef
} from '@angular/material';

import { ApiModule } from '../api/api.module';
import { RoutingModule } from '../routing/routing.module';

import { RegistrationComponent } from './components/registration.component';
import { LoginComponent } from './components/login.component';

import { AccountService } from './services/account.service';

@NgModule({
	imports: [
		BrowserModule,
		MatInputModule,
		MatDialogModule,
		MatProgressSpinnerModule,
		MatButtonModule,
		FormsModule,
		RoutingModule,
		ApiModule
	],
	declarations: [
		RegistrationComponent,
		LoginComponent
	],
	entryComponents: [
		LoginComponent,
		RegistrationComponent
	],
	providers: [
		AccountService,
		MatDialog,
		MatDialogRef
	]
})
export class AccountModule {}
Run Code Online (Sandbox Code Playgroud)

home.component.ts

import { Component } from '@angular/core';

import { MatDialog } from '@angular/material';
import { RegistrationComponent } from '../account/components/registration.component';

@Component({
    moduleId: module.id.replace('compiled', 'app'),
    templateUrl: 'home.component.html'
})
export class HomeComponent
{
    constructor(private modalService: MatDialog) {}

    public openModal() : void
    {
        let dialog = this.modalService.open(RegistrationComponent, {});
    }
}
Run Code Online (Sandbox Code Playgroud)

registration.component.ts

import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { MatDialogRef } from '@angular/material/dialog';

import { User } from '../../../models/domain/User';
import { ApiUserService } from '../../api/entity-services/user.service';
import { AuthService } from '../../auth/auth.service';
import { AccountService } from '../services/account.service'

@Component({
	selector: 'registration-component',
	templateUrl: 'app/modules/account/templates/registration.component.html'
})
export class RegistrationComponent
{
	public user :User = new User();

	public errorMessage :string;

	public isLoading :boolean;

	constructor
	(
		private userService :ApiUserService,
		private authService :AuthService,
		private accountService :AccountService,
		private router :Router,
		public dialogRef :MatDialogRef<RegistrationComponent>
	)
	{
		this.isLoading = false;
	}

	public onSubmit(e) :void
	{
		e.preventDefault();
		this.isLoading = true;

		this.userService
			.Create(this.user)
			.subscribe(
				user =>
				{
					this.user.id = user.id;
					this.user.login = user.login;


					this.authService
						.Login(this.user)
						.subscribe(
							token =>
							{
								this.accountService.Load()
									.subscribe(
										account =>
										{
											this.user = account;
											this.isLoading = false;
											this.dialogRef.close();

											let redirectRoute = account.activeScopeId
												? `/scope/${account.activeScopeId}`
												: '/scope-list/';

											this.router.navigate([redirectRoute]);
										},
										error => this.errorMessage = <any>error
									);
							},
							error => this.errorMessage = <any>error
						);
				},
				error => this.errorMessage = <any>error
			);
	}
}
Run Code Online (Sandbox Code Playgroud)

FRE*_*CIA 33

将对话框添加到要在许多组件中共享的服务时出现此错误.只是为了澄清,在将对话框移动到服务之前,应用程序中不存在错误.解决方案是MatDialogRef在主模块中包含自定义提供程序

  import {DialogService} from './services/dialog.service';
  import {MatDialogModule, MatDialogRef} from '@angular/material/dialog';
  ...
  imports: [
    ...
    MatDialogModule
  ],
  providers: [
     {
       provide: MatDialogRef,
       useValue: {}
     },
     DialogService
  ],
  ...
Run Code Online (Sandbox Code Playgroud)

使用此提供程序,该服务作为单例使用,我的对话框将被共享,提供程序错误消失了.

  • 辉煌!我还必须添加`{provide:MAT_DIALOG_DATA,useValue:{}` (4认同)

Hie*_*ran 16

例如你正在使用 app-checkout

如果您以“对话框”和“普通”方式使用组件添加app-checkout普通 html 文件,则可能会发生这种情况。

解决方案1:<app-checkout> </app-checkout>如果不需要在html文件中以正常方式导入,则删除

在对话框和 html 文件中使用的解决方案 2。取而代之的是:

// ... something have selector: "app-checkout",
 constructor(
    public dialogRef: MatDialogRef<CheckoutComponent>,
    @Inject(MAT_DIALOG_DATA) public dialogData: any
  ) {}
Run Code Online (Sandbox Code Playgroud)

你需要注入它(使其成为可选注入):

这边走:


  constructor(
    // only need the @Optional() before the public dialogRef 
    @Optional() public dialogRef: MatDialogRef<CheckoutComponent>, 
    @Inject(MAT_DIALOG_DATA) public dialogData: any
  ) {

  }

Run Code Online (Sandbox Code Playgroud)

或者这样:

// ... the same above
  private dialogRef = null;
  private dialogData;
  constructor(private injector: Injector) {
      this.dialogRef = this.injector.get(MatDialogRef, null);
      this.dialogData = this.injector.get(MAT_DIALOG_DATA, null);
  }
Run Code Online (Sandbox Code Playgroud)

  • 你也可以像这样:constructor(@Optional() private ref: MatDialogRef&lt;EditPersonComponent&gt;,) (5认同)

rc2*_*c21 15

多亏了@Edric,我心中已经通过进口解决了这个问题MatDialogModule,MatDialogMatDialogRef@angular/material/dialog代替@angular/material

  • 从“@angular/material”添加“MatDialogModule”为我解决了这个问题。 (4认同)

小智 10

@Optional()只需在dialogRef声明之前添加即可。

例如:

constructor(
    @Optional() public dialogRef: MatDialogRef<yourDialogComponentName>
) {
}
Run Code Online (Sandbox Code Playgroud)


小智 8

我遇到了这个错误并修复了它,你要做的是

  1. 检查您是否像这样在打字稿文件中插入了导入语句

    从“@angular/material/dialog”导入{MAT_DIALOG_DATA, MatDialogRef};

  2. 检查构造函数

      constructor(@Optional() public dialogRef: MatDialogRef<GadgetAuthMessagesComponent>, @Inject(MAT_DIALOG_DATA) public message: string){ }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在转到模块 .ts 并检查导入

    import {MAT_DIALOG_DATA, MatDialogModule, MatDialogRef} from '@angular/material/dialog';
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在 module.ts 中,我们需要将 MatDialogModule 名称放在导入数组下

    MatDialog模块

  5. 现在终于完成了,我们必须更新提供者数组

  constructor(@Optional() public dialogRef: MatDialogRef<GadgetAuthMessagesComponent>, @Inject(MAT_DIALOG_DATA) public message: string){ }
Run Code Online (Sandbox Code Playgroud)

现在应该可以了,希望这对某人有帮助!


Moh*_*hsh 5

在 Angular 12 中,在注入垫对话框之前使用“@Optional()”,如下所示:

 @Optional() @Inject(MAT_DIALOG_DATA) public data:any
Run Code Online (Sandbox Code Playgroud)

并在主应用程序模块中添加了一些代码,如下所示:

  providers: [
    {
      provide: MatDialogRef,
      useValue: {}
    }
  ],
Run Code Online (Sandbox Code Playgroud)

此致。