首页 > 其他分享 >Angular 应用里 NullInjectorError - No provider for XX 错误的一个场景和分析过程

Angular 应用里 NullInjectorError - No provider for XX 错误的一个场景和分析过程

时间:2023-06-19 19:11:21浏览次数:45  
标签:NullInjectorError No module XX 应用程序 模块 import angular 加载

最近处理客户 incident,有个客户从 Spartacus 4 升级到 5.2 之后,启动 Storefront,console 遇到了一个错误消息:

NullInjectorError - No provider for AnonymousConsentTemplatesAdapter!

引起这个错误消息的场景有很多,这个 incident 最后的场景是:

以前的 module 通过 loaded for root 完成,现在改成了 loaded with module 来完成。

在Angular中,模块(Module)是组织代码的基本单元。在使用Angular模块时,有两种方式可以将模块加载到应用程序中:通过 "loaded for root"(根加载)和通过 "loaded with module"(模块加载)。这两种加载方式有一些区别,下面我将详细说明它们,并提供一些例子来说明其用法和效果。

  1. Loaded for root(根加载):
    当我们将一个模块加载为根模块时,它意味着该模块将被整个应用程序共享和使用。根模块在应用程序启动时被加载,并且在整个应用程序的生命周期中保持加载状态。

例子:
假设我们有一个名为 "SharedModule" 的模块,其中定义了一些常用的组件、指令和服务,我们希望这些功能在整个应用程序中都可用。我们可以将 "SharedModule" 模块加载为根模块。

// shared.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { SharedComponent } from './shared.component';
import { SharedDirective } from './shared.directive';
import { SharedService } from './shared.service';

@NgModule({
  declarations: [SharedComponent, SharedDirective],
  imports: [CommonModule],
  providers: [SharedService],
  exports: [SharedComponent, SharedDirective]
})
export class SharedModule { }
// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { SharedModule } from './shared/shared.module';

@NgModule({
  imports: [BrowserModule, SharedModule],
  declarations: [AppComponent],
  bootstrap: [AppComponent]
})
export class AppModule { }

在这个例子中,我们将 "SharedModule" 加载为根模块,并将其导入到应用程序的根模块 "AppModule" 中。这样,"SharedModule" 中定义的组件、指令和服务就可以在整个应用程序中使用,而不需要每个模块都去导入和配置它们。

  1. Loaded with module(模块加载):
    当我们将一个模块加载到另一个模块中时,它意味着该模块仅在该特定模块的上下文中可用。模块加载发生在特定的功能模块中,并且只在该模块及其子模块中生效。

例子:
假设我们有一个名为 "FeatureModule" 的模块,其中包含了一些特定的功能组件、指令和服务,我们希望这些功能仅在 "FeatureModule" 及其子模块中可用。我们可以将 "FeatureModule" 加载到另一个模块中。

// feature.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FeatureComponent } from './feature.component';
import { FeatureDirective } from './feature.directive';
import { FeatureService } from './feature.service';

@NgModule({
  declarations: [FeatureComponent, FeatureDirective],
 

 imports: [CommonModule],
  providers: [FeatureService],
  exports: [FeatureComponent, FeatureDirective]
})
export class FeatureModule { }
// main.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FeatureModule } from './feature/feature.module';

@NgModule({
  imports: [BrowserModule, FeatureModule],
  declarations: [AppComponent],
  bootstrap: [AppComponent]
})
export class MainModule { }

在这个例子中,我们将 "FeatureModule" 加载到另一个模块 "MainModule" 中。这样,"FeatureModule" 中定义的组件、指令和服务仅在 "MainModule" 及其子模块中可用,不会对应用程序的其他模块产生影响。

区别总结:

  • "Loaded for root"(根加载)适用于那些希望在整个应用程序中共享和使用的模块,可以被所有模块访问和调用。
  • "Loaded with module"(模块加载)适用于那些希望在特定模块及其子模块中使用的模块,可以提供特定功能的模块封装,避免全局污染。

根加载可以使模块的功能在整个应用程序中易于访问和使用,而模块加载可以实现模块化的功能封装和局部可用性。根据项目需求和代码组织的目标,可以选择适当的加载方式来实现最佳的代码结构和可维护性。

标签:NullInjectorError,No,module,XX,应用程序,模块,import,angular,加载
From: https://www.cnblogs.com/sap-jerry/p/17491960.html

相关文章

  • nodeSelector + deamonset
    DaemonSet配置文件的语法和结构与Deployment几乎完全一样,只是将 kind 设为 DaemonSet。选择运行节点:当指定.spec.template.spec.nodeSelector,DaemonSet将会在匹配的节点上创建pod。如果都没有指定,DaemonSet在所有node节点上创建pod. spec:  nodeSelector:.com/role:dev......
  • Turndown 源码分析:五、节点相关`root-node.js`和`node.js`
    importcollapseWhitespacefrom'./collapse-whitespace'importHTMLParserfrom'./html-parser'import{isBlock,isVoid}from'./utilities'//单独构造的根节点,防止输入字符串含有多个根元素exportdefaultfunctionRootNode(input,options){var......
  • node.js安装与卸载
    一、安装:官网安装 Node.js(nodejs.org)Node安装C盘与其他盘区别,安装哪个最好!-主要区别在于权限 区别是C盘属于管理员权限,其他盘属于用户权限Node安装C盘时npminstall包cmd以管理员身份运行,必须需要管理员Node安装其他盘时,不是C盘npminstall包需要普通用户权限就可......
  • QA||TypeError: ‘module‘ object is not callable报错怎么debugIHRM接口自动化测试
    unittest.py生成测试报告时执行报错:TypeError:‘module‘objectisnotcallable 代码如下 原因:结合pycharm自动标注和报错信息,分析出应该是HTMLTestRunner使用问题,结合网上查阅说是因为import的问题,所以基本问题定位到了HTMLTestRunner应该导入HTMLTestRunner.py中的HTML......
  • Mongodb 为什么提起处理JSON 就是MOGNODB 的,因为我没得选
    提到JSON的数据处理,大部分人想到的一定是MONGODB,如果不是可以自己好好的反思一下,自己的数据库餐盘是不是缺少MOGNODB这道硬菜,最近也有人问我一个问题,关于使用mongodb的原因是什么,我回答的比较简单,但是我更原因用这样的方式来回答这个问题。提到MOGNODB的特长,必须提到JSON,在数......
  • 2023-06-19 API `getMenuButtonBoundingClientRect` is not yet implemented
    前言:想使用该Api来获取设备导航栏高度,结果报错了:API`getMenuButtonBoundingClientRect`isnotyetimplemented尚未实现API`getMenuButtonBoundingClientRect`原因:该Api不支持在app端或者h5端使用。平台兼容如下: AppH5微信小程序支付宝小程序百度小程序抖音小程序飞书小......
  • nodejs 伪全局变量模块
    使用这个文件可以实现不同文件中读写变量,适合当做共享变量文件名:globals.tsletglobals:any={myGlobal:{value:'canbeanytype:String,Array,Object,...'},aReadonlyGlobal:{value:'thisvalueisreadonly',protected:......
  • ORA-14099: all rows in table do not qualify for specified partition
    1.创建分区表createtablerange_part_range(idnumber,deal_datedate,contentsvarchar2(1000))partitionbyrange(deal_date)(partitionp1valueslessthan(to_date('2015-01-21','yyyy-mm-dd')),partitionp2valueslessthan(to_date......
  • itext生成PDF文件报错“Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized.
    最近需要写一个抽取表结构的工具,类似于powerdesigner中的表图,其中有一步用到了itext这个第三方jar包来生成pdf文件,碰到了一个问题,记录于此。问题描述:工程使用maven构建,pom.xml中对于jar包的定义如下:<dependency><groupId>com.lowagie</groupId><artifactId>itext</artifact......
  • normal数据库关闭hang的问题
    今晚办公楼停电维护,需要提前关闭服务器,为防止异常关闭导致的各种问题,有个测试库,使用shutdownnormal停库,结果就是很常见的hang住了。操作顺序:1.shutdownnormal,然后关闭了当前sqlplus窗口。从alert日志中看:MonJun2216:50:222015Shuttingdowninstance(normal)Stoppingback......