NullInjectorError:没有 InjectionToken MatDialogData 的提供者

问题描述 投票:0回答:6

在我的 Angular 应用程序上运行 jasmine 测试时遇到此错误。

Error: StaticInjectorError(DynamicTestModule)[MyEditDialogComponent -> InjectionToken MatDialogData]: 
  StaticInjectorError(Platform: core)[MyEditDialogComponent -> InjectionToken MatDialogData]: 
    NullInjectorError: No provider for InjectionToken MatDialogData!
error properties: Object({ ngTempTokenPath: null, ngTokenPath: [ 'MyEditDialogComponent', InjectionToken MatDialogData ], ngDebugContext: DebugContext_({ view: Object({ def: Object({ factory: Function, nodeFlags: 33669121, rootNodeFlags: 33554433, nodeMatchedQueries: 0, flags: 0, nodes: [ Object({ nodeIndex: 0, parent: null, renderParent: null, bindingIndex: 0, outputIndex: 0, checkIndex: 0, flags: 33554433, childFlags: 114688, directChildFlags: 114688, childMatchedQueries: 0, matchedQueries: Object({  }), matchedQueryIds: 0, references: Object({  }), ngContentIndex: null, childCount: 1, bindings: [  ], bindingFlags: 0, outputs: [  ], element: Object({ ns: '', name: 'app-edit-ban-dialog', attrs: [  ], template: null, componentProvider: Object({ nodeIndex: 1, parent: <circular reference: Object>, renderParent: <circular reference: Object>, bindingIndex: 0, outputIndex: 0, checkIndex: 1, flags: 114688, childFlags: 0, directChildFlags: 0, childMatchedQueries: 0, matchedQueries: Object, matchedQueryIds: 0 ...
Error: StaticInjectorError(DynamicTestModule)[MyEditDialogComponent -> InjectionToken MatDialogData]: 
  StaticInjectorError(Platform: core)[MyEditDialogComponent -> InjectionToken MatDialogData]: 
    NullInjectorError: No provider for InjectionToken MatDialogData!

我正在导入我的组件:

import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';

在组件构造函数中,我将数据注入到对话框中:

 @Inject(MAT_DIALOG_DATA) public data: {
        myData : MyData
    }

在我要导入的组件的 karma jasmin 规范中:

import {
    MatFormFieldModule,
    MatInputModule,
    MatDialogModule,
    MatDialogRef,
    MAT_DIALOG_DATA,
    MatButtonModule,
    MatRadioModule,
    MatSelectModule
} from '@angular/material';

在组件的 karma/jasmine 规范中,

beforeEach
中的导入和提供者:

 beforeEach(async(() => {
    TestBed.configureTestingModule({
        declarations: [ MyFormComponent ],
        imports: [
            MatFormFieldModule,
            MatInputModule,
            MatDialogModule,                               
        ],
        providers: [
            { provide: MatDialogRef, useValue: {} },
            { provide: MAT_DIALOG_DATA, useValue: { myData: MyData } }
        ]
    }).compileComponents();
}));

我已经尝试过这些答案,但它们不能解决问题 这个 这个

angular jasmine angular-material karma-jasmine
6个回答
51
投票

在我的例子中,我导入了指令 MatDialogModule、MAT_DIALOG_DATA 和 MatDialogRef

import { MatDialogModule, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';

然后在

beforeEach()
内:

imports: [ MatDialogModule],
providers: [
    { provide: MAT_DIALOG_DATA, useValue: {} },
    { provide: MatDialogRef, useValue: {} }
  ]

1
投票

尝试从 karma jasmin 规范中删除 MatDialogRef 和 MAT_DIALOG_DATA,以及需要像这样对话框导入的组件:

imports: [
    DynamicModule.withComponents([YOUR_DIALOG_COMPONENT])
]

1
投票

在编辑对话框组件中,我将数据对象传递到 close 方法中。我删除了它,错误就消失了。

改变了这一点:

this.dialogRef.close(myData);

对此:

 this.dialogRef.close();

0
投票

我尝试过这个并且成功了!在你的组件构造函数中执行此操作

constructor(
    private injector: Injector,
  ) {
    super();
    this.dialogData = this.injector.get(MAT_DIALOG_DATA, null);
    if (this.dialogData) {
     // do your job here
    }

}


0
投票

如果其他答案没有帮助,请注意,如果使用注入的组件像任何其他组件一样使用其选择器,则会抛出注入错误。

这解决了我的项目中的相同错误。


0
投票

就我而言,我在提供程序中添加了

MAT_DIALOG_DATA
,它为我解决了问题

import { MatDialogRef, MAT_DIALOG_DATA,} from "@angular/material/dialog";



providers: [{ provide: MatDialogRef, useValue: {}}, { provide: MAT_DIALOG_DATA, useValue: {} }, ]
© www.soinside.com 2019 - 2024. All rights reserved.