NullInjectorError:没有提供 ElementRef

Posted

技术标签:

【中文标题】NullInjectorError:没有提供 ElementRef【英文标题】:NullInjectorError: No provider for ElementRef 【发布时间】:2019-12-28 18:55:49 【问题描述】:

我在我的项目(Angular 8 + Material Design)的一个模块中创建了一个内部指令。跟随教程和官方文档。

@Directive(
  selector: '[button-confirmation]'
)
export class ButtonConfirmationDirective 

  @Output('bc-confirm')
  confirmAction = new EventEmitter<any>();

  @Input('bc-options')
  options: Option[] = [...];

  constructor(
    private el: ElementRef,
    private confirmationService: ConfirmationService
  )  

  @HostListener('mouseup') onMouseUp() 
    this.confirmationService.displayConfirm(this.el, this.options, this.confirmAction);
  


好的,它的工作。但是,当我创建一个外部库并移动我的指令(带有组件、服务等)时,我得到了错误:

ERROR NullInjectorError: "StaticInjectorError(AppModule)[ButtonConfirmationDirective -> ElementRef]: 
  StaticInjectorError(Platform: core)[ButtonConfirmationDirective -> ElementRef]: 
    NullInjectorError: No provider for ElementRef!"

ng new fop-common -S 创建的库,然后是ng g library fop-common,然后我清理了我的 lib 文件夹,保留了 module.ts 并添加了我的指令/组件/服务...

button-confirmation.module.ts

@NgModule(
  declarations: [
    ButtonConfirmationComponent,
    ButtonConfirmationDirective
  ],
  imports: [
    CommonModule,

    MatButtonModule,
    MatIconModule,
    MatTooltipModule
  ],
  providers: [
    ConfirmationService,
    DomService
  ],
  exports: [
    ButtonConfirmationComponent,
    ButtonConfirmationDirective
  ],
  entryComponents: [
    ButtonConfirmationComponent
  ]
)
export class ButtonConfirmationModule  

fop-common.module.ts 看起来像

@NgModule(
  declarations: [
    JoinPipe
  ],
  imports: [],
  exports: [
    JoinPipe,
    ButtonConfirmationModule
  ]
)
export class FopCommonModule  

在我的项目中,我导入它

  imports: [
...
    FopCommonModule
  ],

对于 lib 的安装,我使用本地方式(没有 npm 的私人项目):npm install ../fop-common/dist/fop-common --save

我已经有接口和管道工作,所以它在全球范围内工作,但只是有 ElementRef 问题,但没有发现这种情况(除了带有符号链接参数的

任何帮助不胜感激。提前致谢。

【问题讨论】:

您能告诉我们您是如何定义ButtonConfirmationModule 类的吗?您是否包含ButtonConfirmationModule 使用的必要模块(例如@angular/core 中的CommonModule 等)? 嗨,我将其添加到问题中。 CommonModule 在。重复一遍,如果它不在外部库中,但在项目中,它运行良好。如果您需要更多,请不要犹豫。谢谢 按照其他教程,我也尝试直接公开 ButtonConfirmationModule 但结果是一样的。 【参考方案1】:
"paths": 
    "@angular/*": [
        "./node_modules/@angular/*"
    ]

在应用程序的 tsconfig(链接到库的位置)而不是库中创建 paths 映射。

【讨论】:

它适用于StaticInjectorError(Platform: core)[NgClass -&gt; ElementRef]: 【参考方案2】:

对于lib的安装,我使用了本地方式(私人项目 没有 npm):npm install ../fop-common/dist/fop-common --save

通常您不必这样做。当您执行ng g library fop-common 时,它应该在项目的 tsconfig.json 中创建了一个别名路径,您只需要使用import ... from 'fop-common'; 导入您的库

我不确定是不是问题,但我在尝试本地安装依赖项时已经遇到了一些问题。

【讨论】:

您好,我们的目标是构建一个单独的库,而不是在项目工作区中有这个库,我在不同的 git repo 中创建了不同的应用程序,一切都是独立的。也许你知道这样的方法?【参考方案3】:

你在 tsconfig.ts 的 compilerOptions 中添加这个:

  "paths": 
      "@angular/*": [
        "./node_modules/@angular/*"
      ]
    

【讨论】:

【参考方案4】:

没有找到解决方案。

我将代码(仅,而不是 lib 上下文)放回项目中,而不是创建一个 lib,但我将两个 git repo 分开以供重用。

所以诀窍是添加一个安装后脚本来创建一个 /src/libsub 文件夹,里面有“lib”repo(git clone),编辑主项目 .gitignore 以添加这个 libsubfolder,你就有了一个“工作”技巧解决方案.

为了更方便,我编辑了 tsconfig.json 以添加路径配置来映射 libsubfolder,以便通过主项目进行所有导入。

所以我避免将所有项目放在同一个 repo(angular /projects 文件夹)中,我使其可维护、可重用且易于放置,并且每个项目都有自己的 repo。所以对我来说没问题。

感谢谁试图提供帮助。

【讨论】:

我遇到了类似的错误并通过重新启动服务器解决了它,这是在将依赖注入添加到类文件之后。【参考方案5】:

我在尝试使用共享库模块中的 UI 控件时遇到此 NullInjector 错误,将 @angular 路径添加到我的应用程序的 tsconfig.json 解决了该问题。与 Ashwani Kumar 建议的相同。

"paths": 
    "@angular/*": [
        "./node_modules/@angular/*"
    ]

【讨论】:

以上是关于NullInjectorError:没有提供 ElementRef的主要内容,如果未能解决你的问题,请参考以下文章

NullInjectorError:ReducerManager 没有提供程序

角度业力 - NullInjectorError:InjectionToken 配置没有提供者

NullInjectorError:没有 HttpClient 的提供者

NullInjectorError:没有提供 DecimalPipe

Angular:NullInjectorError:没有HttpClient的提供者[重复]

Angular 9:NullInjectorError:没有 CompilerFactory 的提供者