【问题标题】:Angular Singleton Service With Componnets带有组件的 Angular 单例服务
【发布时间】:2020-05-21 21:18:13
【问题描述】:

这更像是一个结构性问题,而不是与错误相关的问题。我正在编写一个 Angular 应用程序,遵循广泛使用的核心、共享和功能模块结构,例如 here。 我也在核心模块中定义了一个单例通知服务,除了我使用如下自定义组件来自定义我的通知:

this.snackBar.openFromComponent(
      SnackbarComponent,
      configuration
    );

和 SnackbarComponent

@Component({
  selector: "snackbar",
  templateUrl: "./snackbar.component.html",
  styleUrls: ["./snackbar.component.scss"]
})
export class SnackbarComponent {
  constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) {}
}

我感到困惑的是在哪里放置这个组件的声明。

  1. 如果我将声明放在核心模块中,我的功能模块将无法访问它(功能模块不导入核心模块,核心只导入一次,并且在应用程序的根模块中)。李>
  2. 如果我将声明放在我的共享模块中,那么我的核心模块必须导入我的共享模块才能访问该组件,这与核心模块的概念相反(不应该导入共享模块)。
  3. 显然将我的服务放在共享模块中也不是一个好主意,因为它是一个单例,而且我在其他核心服务中使用此服务(例如错误拦截器)。

请注意,这只是一个示例,用于说明问题。我还有其他一些类似的情况,我的核心服务依赖于组件(对话服务、语言服务)

感谢任何处理此问题的架构建议。

抱歉问题太长了。

【问题讨论】:

  • 我认为您必须将服务放在核心模块中,并使用providedIn root 使其成为单例。对于组件,我不明白为什么您需要在核心模块中使用它,我通常只将单例服务、拦截器、守卫放在核心模块中,没有组件
  • 组件应该在哪里声明呢?在核心模块之外的任何地方,您都需要在核心模块中导入包含它的模块,以便服务访问它。

标签: angular


【解决方案1】:

经过数小时的思考,我想出的一个解决方案是将组件作为参数传递给服务:

open(component: SnackbarComponent) {
    this.snackBar.openFromComponent(
      component,
      configuration
    );
}

不会结束这个问题,因为有人可能有比我更好的解决方案。

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 2018-08-07
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多