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

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

时间:2023-06-24 10:33:21浏览次数:34  
标签:NullInjectorError No module XX 应用程序 模块 import angular 加载

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

NullInjectorError - No provider for AnonymousConsentTemplatesAdapter!

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

引起这个错误消息的场景有很多,这个 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://blog.51cto.com/jerrywangsap/6540962

相关文章

  • Xcode 15 beta 2 (15A5161b) 发布下载 - Apple 平台 IDE (visonOS 1 beta 已发布)
    Xcode15beta2(15A5161b)发布下载-Apple平台IDE(visonOS1beta已发布)IDEforiOS/iPadOS/macOS/watchOS/tvOS/visonOS此版本已加入visonOS支持。请访问原文链接:https://sysin.org/blog/apple-xcode-15/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org......
  • tmux后台终端程序启动工具-替代nohup后台程序启动工具
    还在用nohup后台执行任务吗?快来用tmux原创 艺说IT 艺说IT 2023-05-2810:09 发表于广东收录于合集#linux3个#linux命令1个文章目录一、前言1.1tmux介绍1.2之前后台运行查看日志的方式二、各系统安装tmux方法2.1CentOS2.2UbuntuAnd......
  • DB Notes
    -------------------------------------------------------------------------------------------------[SQLServer]CAST和CONVERT(Transact-SQL) https://learn.microsoft.com/zh-cn/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-ver16---------......
  • XXE漏洞详解
    XML外部实体注入——XXE漏洞详解简单来说一下这个XXE漏洞,在这之前我也阅读了很多关于XXE漏洞的文章,发现有一小部分文章题目是“XXE外部实体注入”这样的字眼,我想这样的文章很大可能都没有弄明白XXE和XML的关系吧,也或者是不小心打错了。看到这里你如果没有反应过来“XXE外部实......
  • Could not locate zlibwapi.dll. Please make sure it is in your library path
    再跑CNN程序的时候报了这个错2023-06-2321:11:52.069321:Itensorflow/core/platform/cpu_feature_guard.cc:151]ThisTensorFlowbinaryisoptimizedwithoneAPIDeepNeuralNetworkLibrary(oneDNN)tousethefollowingCPUinstructionsinperformance-criticalop......
  • vue学习第26天 xxxx响应式页面制作
    项目地址:后续添加 1、布局分析nav2列、article7列、aside3列 2、屏幕划分分析 移动端布局总结1、移动端主流方案 2、移动端技术选型1)流式布局(百分比布局)2)flex布局(推荐)3)rem适配布局(推荐)4)响应式布局建议:我们......
  • solution notes
    用于记录OI刷题中遇到的各种问题与心得,按题库和难度整理。洛谷Luogu普及/提高-P1209[USACO1.3]修理牛棚BarnRepair算法标签:二维DPDP中的状态初始十分重要,以状态\(1\)开始的DP初始化通常只需要考虑\(i,j,k\cdots\)等变量的值为\(0\)或\(1\)的情况。还......
  • jackson 自定义注解 JacksonAnnotation
    packagecom.heima.model.common.annotation;importcom.fasterxml.jackson.annotation.JacksonAnnotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotatio......
  • arduino 电机控制
     intpoint_id2=2;intpoint_id3=3;intpoint_id4=4;intpoint_id5=5;intpoint_id8=8;intpoint_id9=9;intpoint_id10=10;intpoint_id11=11;voidsetup(){//putyoursetupcodehere,torunonce:Serial.begin(9600);pinMod......
  • P3227 [HNOI2013]切糕
    P3227[HNOI2013]切糕题意给定一个\(P\timesQ\)的平面,平面上每一个点上都有一个高度为\(R\)的竖条。竖条上每一个点都有一个不和谐度\(f(x,y,z)\),对于每一个竖条选一个点,要求与周围的点的高度差不超过\(d\)(四联通),求最小不和谐度。题解感觉这道题很神啊,首先我们考......