共享单例服务并避免共享组件中的循环依赖

2023-12-22

技术堆栈

该项目使用在本地 NPM 服务器上运行的 Angular 2 和 TypeScript,并使用 Angular CLI 构建。

架构

该项目共有三个模块。第一个用于非 UI 服务和组件。第二个是 UI 组件和布局。第三个也是最后一个模块用于 UI 服务。它们被细分如下图所示:

正如您所看到的,我真的不确定这里是否需要父模块,因此最上面的项目“?父模块?”

问题

  1. 跨多个模块共享服务的单例
  2. 当两个模块需要彼此运行时避免循环依赖

问题 1 - 跨多个模块共享服务单例

就我而言,我需要用户界面模块 and 非UI模块共享所有服务的单例用户界面服务模块.

我尝试过的

到目前为止我已经尝试使用forRoot()无济于事,并尝试将服务本身移动到父模块并从那里提供它们。无论我做什么,我似乎都无法让两个模块从 UI 服务模块共享一个单例。

问题 2 - 当两个模块相互需要时避免循环依赖

我在应用程序中面临的另一个问题是,一个模块的一部分需要另一个模块的所有部分,而另一个模块又需要第一个模块的部分才能工作。

在非 UI 模块中,您将看到页眉/页脚需要使用 UI 模块才能发挥作用。但是,在 UI 模块中,布局需要访问页眉/页脚,以便将这些项目作为布局的一部分提供。这形成了一种循环依赖,我无法完全消除它。

我尝试过的

我考虑过将布局从 UI 模块移到自己的模块中,但是它们也需要对 UI 模块的组件部分的引用,因此,如果我一旦导入该模块,我就会再次创建循环依赖项。

解决方案

我需要一种方法来消除循环依赖,并以某种方式在所有其他模块之间共享 UI 服务模块中所有服务的单例。

我已经连续一周试图找到解决这两个问题的方法了,我想在这一点上我只见树木不见森林。我确信我错过了一些愚蠢的事情,但我似乎无法解决这个问题。


Have a CoreModule它只提供不依赖于任何其他模块的服务,并且这些服务预计是单例的。该模块应由 root 导入AppModule仅有的。这将保证这些服务是单例的(它们仅在CoreModule)。在我的应用程序中,这是我提供全球服务的地方,例如AuthService。这将解决您的单例问题。

Have a SharedModule导出组件、指令,甚至由多个模块共享的 Angular 模块。在我自己的应用程序中,该模块包含我到处使用的组件,例如DialogComponent,或者 Angular 自己的FormsModule and CommonModule. This SharedModule does not为您提供全球服务。将此模块导入到所有其他模块中。这将解决您的循环依赖问题。

简而言之,你可以想到CoreModule and SharedModule作为辅助模块。它们本身不会构建您的网站,但它们提供您的网站模块所需的依赖项。您可能会受益于阅读本章 https://angular.io/guide/ngmodule文档,然后返回到您的项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

共享单例服务并避免共享组件中的循环依赖 的相关文章

  • 是否可以使用纯 css 禁用 mat-tab 动画

    我想禁用 Angular Material mat tab 动画 内容滑入到位时发生的动画 我知道可以使用 disabled 属性 但我想知道是否可以使用纯 css 达到相同的效果 EDIT 我们的用户体验团队希望从材质选项卡中删除幻灯片动
  • 创建本身异步的自定义管道

    我创建了一个自定义管道 用于从 API 检索文本内容 如下所示 Pipe name apiText export class ApiTextPipe implements PipeTransform constructor private
  • 传单 - 导入 Geojson - Angular 6

    我尝试将 GeoJson 文件导入到 Angular 的应用程序 6 中的传单中 通过这个解决方案 我的 geojson 是在 leafletmap 中绘制的 但我有这个错误 我无法构建我的应用程序 有人知道一种解决方案吗 错误 TS234
  • Angular + Material - 如何使用 formgroup 处理多个复选框

    我有一个从后端获得的兴趣列表 我希望用户能够选择他们想要的兴趣 我将只存储他们在数据库中检查的兴趣 并在他们加载页面时预先填充 但首先我需要获取用户选择的这些兴趣 兴趣组件 ts export class InterestsComponen
  • Angular 反应式表单:使用单个 formControlName 同步多个输入

    我正在建造一个反应形式 https angular io guide reactive forms在 Angular 11 中 它分为多个 div 项目所有者希望在每个 div 中进行一些重复输入 以便用户可以编辑某个字段 A 的输入 并且
  • 定义文件:属性的多种可能类型

    我正在为现有的 JS 库 CKEditor 编写一些定义 是否可以更具体toolbar any 文档 工具栏 数组 字符串 工具箱 别名工具栏 定义 它是工具栏名称或 工具栏 条 数组 每个工具栏也是一个数组 包含一个 UI 项目列表 库代
  • 将打字稿中的字符串转换为时间格式

    我必须将服务器数据转换为字符串格式13 47 to 01 47PM但我正在尝试 time date hh MM and task time date shortTime 但它显示日期管道错误和参数错误 运行时错误 InvalidPipeAr
  • 在 Nest.js 中发送之前如何格式化响应?

    我按照文档进行操作 并能够添加用于响应映射的拦截器 我想要一致的 json 格式输出作为响应 我怎样才能用拦截器或其他比这种方法更好的方法来实现这一点 statusCode 201 message Custom Dynamic Messag
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • Gulp 和 TS 编译

    我在我的 gulp 文件中定义了任务 gulp task dev build scripts function var tsResult tsProject src pipe sourcemaps init pipe ts tsProjec
  • 如何使用“ADDMORE”按钮在 Angular 6 中上传多个文件?

    你好 埃弗龙 我一直在尝试上传上面 图片 用例 我知道当我们只有一个文件时这很容易 但现在的情况不同了 它由带有文件的对象数组组成 现在我的问题是如何使用对象数组渲染 formdata 对象 其中每个对象都包含一个文件 对于动态形式 我使用
  • 如何以角度从守卫重定向到子路线

    如何从父路由的守卫重定向到子路由 同时保护子路由不被直接访问 绝对导航的问题当导航到子路由时 父组件上的守卫会在循环中再次调用 相对导航问题是警卫正在保护父路线 因此还没有激活的路线可供导航 此外 这可能不会保护子路由 也许同一个守卫也可以
  • 我们什么时候需要在 Angular2 的服务中使用 @Injectable ?

    All 我对 Angular2 还很陌生 当我到达依赖注入部分时 Injectable 符号让我有点困惑 只是想确保我对 Injectable 的理解是正确的 Injectable 表示它后面的类可以作为服务注入 Injectable 表示
  • 使用 Javascript 在前端创建基本 URL(开发、API 和生产)

    无论开发和部署如何 如何制作适用于 http https localhost 端口和实际域的基本 url 我想创建一个可以在所有场景或条件下工作的基本 url 无论 http https 协议 端口 本地主机和实际域如何 无论是在开发中还是
  • 无法读取未定义的属性“toUpperCase”(“<输入名称 =“searchtext”[(ngModel)] =“searchtext”>

    我正在尝试从数字数组中过滤数字 但我遇到了这个错误 这是我的代码 应用程序模块 ts import BrowserModule from angular platform browser import NgModule from angul
  • Angular 中的动态子组件

    我正在构建一个具有一致的元素列表设计模式的应用程序 如果我有一个 A 类型的对象 我会创建AComponent它接受a作为输入 然后创建另一个组件来迭代 A 列表 AListComponent 那么如果我有一个对象 B 我需要做同样的事情
  • Typescript 继承:扩展基类对象属性

    当扩展一个类时 我可以轻松地向它添加一些新属性 但是 如果当我扩展基类时 我想向基类的对象 简单对象的属性 添加新属性怎么办 这是一个带有一些代码的示例 基类 type HumanOptions alive boolean age numb
  • 使用验证器禁用 FormGroup

    I had formArray我的复选框checkboxForm 如果没有复选框 我需要禁用按钮提交checked 我在我的上实现了自定义验证器checkboxForm 这是我尝试过的 Ts file get formReceivedSum
  • 如何重启ngOnInit来更新Interpolation

    有办法重新启动吗ngOnInit 改变变量时 因为我想重新开始ngOnInit 改变时theme多变的 这是我的代码 设置 ts export class SettingsPage implements OnInit phraseColor
  • 根据唯一测试提取站点地图 URL 和 cy.request() 每个 URL (Cypress) [重复]

    这个问题在这里已经有答案了 将 Cypress 与 TypeScript 结合使用 我的代码目标是提取 sitemap xml 中的所有 URL 和 cy request 每个 URL 的状态 200 这个版本的工作原理 describe

随机推荐