我正在使用材料2版本2.0.0-beta.12。我需要调整材质Modal的位置。我按照这个答案来做到这一点。 https://stackoverflow.com/a/44238699/8253445由于MdDialog现在不可用,我使用了{MatDialog,MatDialogRef,MAT_DIALOG_DATA}。
constructor(public dialog: MatDialog,public dialModRef:MatDialogRef<any>) {}
当我将MatDialogRef添加到我的构造函数时,它给了我“MatDialogRef没有提供者”错误。请你帮我解决一下这个问题?
对话框的概述-example.ts
import {Component, Inject} from '@angular/core';
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from
'@angular/material';
@Component({
selector: 'dialog-overview-example',
templateUrl: 'dialog-overview-example.html'
})
export class DialogOverviewExample {
animal: string;
name: string;
constructor(public dialog: MatDialog,public
dialModRef:MatDialogRef<any>) {}
openDialog(): void {
let dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
width: '500px',
data: { name: this.name, animal: this.animal }
});
dialogRef.afterClosed().subscribe(result => {
console.log('The dialog was closed');
this.animal = result;
});
}
}
@Component({
selector: 'dialog-overview-example-dialog',
templateUrl: 'dialog-overview-example-dialog.html',
})
export class DialogOverviewExampleDialog {
constructor(
public dialogRef: MatDialogRef<DialogOverviewExampleDialog>,
@Inject(MAT_DIALOG_DATA) public data: any) { }
onNoClick(): void {
this.dialogRef.close();
}
}
app.module.ts
entryComponents: [DialogOverviewExample,DialogOverviewExampleDialog]
对话框的概述-示例-dialog.html
<h1 md-dialog-title>Hi {{data.name}}</h1>
<div md-dialog-content>
<p>What's your favorite animal?</p>
<md-form-field>
<input mdInput tabindex="1" [(ngModel)]="data.animal">
</md-form-field>
</div>
<div md-dialog-actions>
<button md-button tabindex="2">Ok</button>
<button md-button (click)="onNoClick()" tabindex="-1">No Thanks</button>
</div>
答案 0 :(得分:17)
你会得到那个确切的
如果您在没有
的提供者MatDialogRef
dialog-overview-example.html
<dialog-overview-example-dialog></dialog-overview-example-dialog>
中加入对话框的组件html选择器,则会出现错误,如@Repository
public interface UserRepository extends CrudRepository<User, Integer> {
}
没有必要,不要在任何地方包含对话框组件的html选择器。
答案 1 :(得分:15)
您需要在模块文件中导入此模块(默认情况下为app.module.ts
):
import { MatDialogModule } from '@angular/material';
并在模块声明中添加MatDialogModule
到imports
:
@NgModule({
declarations: [...],
imports: [
...
MatDialogModule,
...
],
providers: [...],
entryComponents: [...],
bootstrap: [...]
})
修改强>
您需要通过this.dialogRef.close();
传递数据,才能result
工作subscribe
。例如:
@Component({
selector: 'dialog-overview-example-dialog',
templateUrl: 'dialog-overview-example-dialog.html',
})
export class DialogOverviewExampleDialog {
someValue: boolean = false;
constructor(
public dialogRef: MatDialogRef<DialogOverviewExampleDialog>,
@Inject(MAT_DIALOG_DATA) public data: any) { }
onNoClick(): void {
this.dialogRef.close(this.someValue);
}
}
答案 2 :(得分:4)
问题在于,您将<dialog-component></dialog-component>
包含在代码中的某个位置,并使用@Inject将其注入视图。如果您从其中使用的任何template.html中删除了<dialog-component></dialog-component>
,它就可以使用!
答案 3 :(得分:3)
许多Angular Material examples会将MatDialogRef
导入显示为:
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog';
这将导致以下错误(例如,在创建服务以包装对话框组件的创建时):
ERROR NullInjectorError: StaticInjectorError(AppModule)[DialogComponent -> MatDialogRef]:
StaticInjectorError(Platform: core)[DialogWarningComponent -> MatDialogRef]:
NullInjectorError: No provider for MatDialogRef!
import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material';
如果角度材质 module
使用导入from '@angular/material/dialog'
,也会发生此错误。建议如下构造材料模块:
import { NgModule } from '@angular/core';
import { CdkTableModule } from '@angular/cdk/table';
import { CdkTreeModule } from '@angular/cdk/tree';
import { DragDropModule } from '@angular/cdk/drag-drop';
import { ScrollDispatchModule } from '@angular/cdk/scrolling';
import {
MatAutocompleteModule,
MatBadgeModule,
...
MatDialogModule,
...
} from '@angular/material';
@NgModule({
exports: [
CdkTableModule,
CdkTreeModule,
DragDropModule,
ScrollDispatchModule,
MatAutocompleteModule,
MatBadgeModule,
...
MatDialogModule,
...
]
})
export class MyMaterialModule { }
答案 4 :(得分:2)
从DialogOverviewExample组件中删除MatDialogRef。你不需要那里。它应该工作。
答案 5 :(得分:2)
您将MatDialogRef
注入了打开对话框的DialogOverviewExample
组件的构造函数中,但它不是对话框。
MatDialogRef
只能注入作为对话框打开的组件中,否则就没有dialogRef
了,因此会触发此错误。