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)
使用此提供程序,该服务作为单例使用,我的对话框将被共享,提供程序错误消失了.
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)
rc2*_*c21 15
多亏了@Edric,我心中已经通过进口解决了这个问题MatDialogModule,MatDialog并MatDialogRef从@angular/material/dialog代替@angular/material
小智 10
@Optional()只需在dialogRef声明之前添加即可。
例如:
constructor(
@Optional() public dialogRef: MatDialogRef<yourDialogComponentName>
) {
}
Run Code Online (Sandbox Code Playgroud)
小智 8
我遇到了这个错误并修复了它,你要做的是
检查您是否像这样在打字稿文件中插入了导入语句
从“@angular/material/dialog”导入{MAT_DIALOG_DATA, MatDialogRef};
检查构造函数
constructor(@Optional() public dialogRef: MatDialogRef<GadgetAuthMessagesComponent>, @Inject(MAT_DIALOG_DATA) public message: string){ }
Run Code Online (Sandbox Code Playgroud)
现在转到模块 .ts 并检查导入
import {MAT_DIALOG_DATA, MatDialogModule, MatDialogRef} from '@angular/material/dialog';
Run Code Online (Sandbox Code Playgroud)
在 module.ts 中,我们需要将 MatDialogModule 名称放在导入数组下
MatDialog模块
现在终于完成了,我们必须更新提供者数组
constructor(@Optional() public dialogRef: MatDialogRef<GadgetAuthMessagesComponent>, @Inject(MAT_DIALOG_DATA) public message: string){ }
Run Code Online (Sandbox Code Playgroud)
现在应该可以了,希望这对某人有帮助!
在 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)
此致。
| 归档时间: |
|
| 查看次数: |
36349 次 |
| 最近记录: |