【问题标题】:Angular service providedIn VS forRoot在 VS forRoot 中提供了 Angular 服务
【发布时间】:2018-11-11 18:28:52
【问题描述】:

我想知道这两个代码块是否等价。

我可以将providedInforRoot 的结果相同吗?

@Injectable({
  providedIn: 'root'
})
export class MyService {
  constructor() { }
}

@Injectable()
export class MyService {
  constructor() { }
}

@NgModule({
  imports: []
})
export class MyModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: MyModule,
      providers: [
        MyService
      ]
    };
  }
}

@NgModule({
  imports: [
    MyModule.forRoot()
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

[我仍会保留我的 MyModule 以供 providedId 单例服务单独使用]

【问题讨论】:

    标签: angular


    【解决方案1】:

    使用providedInproviders[]

    1. providedIn 是 Angular 执行 DI 的新方法。 providedIn 是从 Angular 6 开始引入的

    2. 官方名称是“Tree-shakeable providers”——不再是提供所有服务的模块,而是由服务本身声明应该提供的位置

    3. 使用providedIn: 'root' 完全不需要导入库模块,我们可以简单地注入所需的服务,它就可以工作了

    【讨论】:

    • 是的,这样providedInforRoot 更好,因为它更容易摇树。
    • 那我们为什么还要使用RouterModuleforRoot 模式呢?
    【解决方案2】:

    是的,forRootprovideIn 都是等价的,因为它们都将为应用程序创建唯一且唯一的一个单例。即使它是在延迟加载的组件中加载的。

    参考这篇不错的文章 - https://medium.com/@chrishouse/when-to-use-angulars-forroot-method-400094a0ebb7

    【讨论】:

      【解决方案3】:

      providedIn 将根据值直接注入 service - 如果它是“根”,它将直接注入根 module - 这将帮助您停止在模块 [providers] 中添加 service

      Angular 将在 module 中注入服务 - 如果您使用延迟加载模块 - Angular 将在您加载其他模块时创建新的注入器

      如果您使用延迟加载,最好在模块上使用 forRoot() 注入,并确保您的 service 不会创建多个注入器

      希望这对您有所帮助 - 编码愉快!!

      查看此link 了解更多信息

      【讨论】:

      • 所以在延迟加载的情况下你确定使用 provideIn 如果你能构建一个简单的运行示例,我将不胜感激:) 谢谢你的帮助
      • 您可以查看该链接以获得进一步说明 - 谢谢 :)
      • providedIn 在延迟加载组件中使用单例服务实例时工作得很好。我真的不明白为什么在 forRoot 已经就位的情况下引入了 Angular !查看此链接:stackblitz.com/edit/angular-treeshakable-providedin-3pbafd
      猜你喜欢
      • 2020-12-21
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多