javascript - 分发各种@angular/material模块的 Angular 共享模块NullInjectorError : No provider

标签 javascript angular typescript angular-material angular-module

我有一个 uiModule。它导入和导出各种@angular/material模块。

我曾希望当我导入uiModule时进入anotherModule ;现在anotherModule将可以访问@angular/material的东西...但这并不完全有效。

虽然 Material 在 uiModule 内工作正常 — anotherModule识别物质元素,但存在很多错误,例如

NullInjectorError: No provider for InjectionToken mat-menu-scroll-strategy!

NullInjectorError: No provider for Overlay!

我在尝试使用 <mat-menu> 后得到了这些例子

这里是 uiModule

// material
import { MatExpansionModule } from '@angular/material/expansion';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatChipsModule } from '@angular/material/chips';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatMenuModule } from '@angular/material/menu';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatNativeDateModule } from '@angular/material/core';
import { MatIconModule } from '@angular/material/icon';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatDialogModule } from '@angular/material/dialog';

const material = [
  MatIconModule,
  MatProgressSpinnerModule,
  MatProgressBarModule,
  MatExpansionModule,
  MatInputModule,
  MatChipsModule,
  MatAutocompleteModule,
  MatFormFieldModule,
  MatDatepickerModule,
  MatNativeDateModule,
  MatMenuModule,
  OverlayModule,
  MatDialogModule,
  ScrollingModule,
];

@NgModule({
  declarations: [
    PaginationComponent,
  ],
  imports: [
    CommonModule,
    FormsModule,
    ReactiveFormsModule,
    ...material,
  ],
  providers: [],
  exports: [
    PaginationComponent,
    ...material,
  ],
})

最佳答案

您看到的错误有一个模式,它们都是有关提供商的错误!您使用 Material 组件的地方缺少一些提供程序。示例:覆盖提供程序。

组件和服务的工作方式有点不同。

如果您在模块 A 中导出组件 A 并在 B 中导入组件的模块,则可以在另一个模块 (B) 中使用组件 (A)。这需要在您想要使用组件 A 的每个模块中完成.

但是,如果模块 A 需要服务,则可以在模块级别或根级别提供该服务。如果您缺少提供此信息,您可能会收到此错误。

由于您尚未发布任何使用 Material 组件并面临错误的代码,因此我将展示一个可能发生这种情况的用例。

案例: anotherModule 有一个组件,该组件的 html 中有一个可打开对话框的按钮。

对话框组件不会在打开它们的组件内呈现。他们确实可以访问另一个模块的注入(inject)器。因此,即使您已在 materialModule 中导入了 uiModule,但如果尚未在 AppModule 中导入,也会弹出 Noprovider for XYZ 错误。

因此,请尝试在 AppModule 中导入此 uiModule

关于javascript - 分发各种@angular/material模块的 Angular 共享模块NullInjectorError : No provider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70293394/

相关文章:

javascript - JComponent 全局方法 GET 在 Total.js Flow 组件中不起作用

javascript - 如何在javascript中将字符串方程式转换为数字?

javascript - JS - 过滤对象的嵌套数组

javascript - 照片未显示 Ionic 3

javascript - 为什么没有定义 html2canvas?

angular - 在AngularDart中正确使用流

javascript - 从重复嵌套的 JSON 中获取多个值

Angular 通用 + PM2 : Keeps exiting and restarting

javascript - 如何在 vscode 中获取字符串参数的 Javascript 自动完成?

angular - 理解 TypeScript 中的问号、冒号和未定义